home *** CD-ROM | disk | FTP | other *** search
/ Aminet 25 / Aminet 25 (1998)(GTI - Schatztruhe)[!][Jun 1998].iso / Aminet / gfx / fract / FlashMandel.lha / FlashMandel / Sources / FlashMandel.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-04-23  |  127.0 KB  |  3,927 lines

  1. /*******************************************************************************
  2. **
  3. **  Coded by Dino Papararo              23-Apr-1998
  4. **
  5. *******************************************************************************/
  6.  
  7. #define __USE_SYSBASE
  8.  
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <string.h>
  12. #include <proto/exec.h>
  13. #include <proto/dos.h>
  14. #include <proto/intuition.h>
  15. #include <proto/diskfont.h>
  16. #include <proto/graphics.h>
  17. #include <proto/gadtools.h>
  18. #include <proto/utility.h>
  19. #include <proto/iffparse.h>
  20. #include <proto/icon.h>
  21. #include <proto/asl.h>
  22. #include <exec/execbase.h>
  23. #include <exec/memory.h>
  24. #include <intuition/intuition.h>
  25. #include <intuition/gadgetclass.h>
  26. #include <graphics/gfxbase.h>
  27. #include <graphics/videocontrol.h>
  28. #include <graphics/scale.h>
  29. #include <iffp/ilbmapp.h>
  30. #include <devices/prtbase.h>
  31. #include <devices/printer.h>
  32.  
  33.  
  34.  
  35. /* To compile the FPU versions uncomment next line */
  36. // #define __USE_FPU
  37.  
  38.  
  39. #ifdef __USE_FPU
  40. #include <m68881.h>
  41. #else
  42. #include <mieeedoub.h>
  43. #endif
  44.  
  45. #define VERSION  "FlashMandel 1.0 "
  46. #define AUTHOR   "Dino Papararo"
  47. #define DATE     __AMIGADATE__
  48. #define COPYRIGHT "©1997"
  49. #define ADDRESS  "          Via Manzoni 184\n\n          80123    Napoli\n\n              Italia\n\n"
  50. #define EMAIL    "     E-Mail:  DinoP@IName.Com"
  51.  
  52. #define INIT_DEF_RMIN      -2.2
  53. #define INIT_DEF_RMAX      +0.8
  54. #define INIT_DEF_IMIN      -1.125
  55. #define INIT_DEF_IMAX      +1.125
  56. #define INIT_DEF_RMINSTR   "-2.2"
  57. #define INIT_DEF_RMAXSTR   "+0.8"
  58. #define INIT_DEF_IMINSTR   "-1.125"
  59. #define INIT_DEF_IMAXSTR   "+1.125"
  60.  
  61. #define DEF_WIDTH       640
  62. #define DEF_HEIGHT      480
  63. #define DEF_PLANES      4
  64. #define DEF_MONITOR     0x00008004
  65. #define DEF_MONITORSTR  "0x00008004"
  66.  
  67. #define MIN_WIDTH  640
  68. #define MIN_HEIGHT 480
  69. #define MAX_WIDTH  16368
  70. #define MAX_HEIGHT 16384
  71. #define MIN_DEPTH  3
  72. #define MAX_DEPTH  8
  73.  
  74. #define RAW_ESC      0x045
  75. #define VAN_ESC      0x01B
  76. #define TAB          0x042
  77.  
  78. #define FIXED_POINT      (28L)                /* Bit di Precisione */
  79. #define MAX_POT          (1L << FIXED_POINT)  /*   2^FIXED_POINT   */
  80.  
  81. #define MINLIMIT 2
  82.  
  83. #define BLACK      (0)
  84. #define LIGHT_GREY (2)
  85. #define WHITE      (1)
  86. #define DARK_GREY  (3)
  87.  
  88. #define POINTS       4
  89. #define PAIRS        5
  90.  
  91. #define MYSECS       (50L << 1L)
  92.  
  93. #define SHIFTRIGHT   FALSE
  94. #define SHIFTLEFT    TRUE
  95.  
  96. #define INITIALZOOM  14
  97.  
  98. #define ZPW          15
  99. #define ZPH          15
  100. #define ZPXO         -8
  101. #define ZPYO         -7
  102.  
  103. #define ZZZPW        16
  104. #define ZZZPH        16
  105. #define ZZZPXO       0
  106. #define ZZZPYO       0
  107.  
  108. #define MAXCHARS     85
  109.  
  110. #define ACCEPT       (1)
  111. #define RATIO        (2)
  112. #define RESET        (3)
  113. #define CANCEL       (4)
  114. #define KEEP         (5)
  115.  
  116. #define WMASK  0x1
  117. #define FMASK  0x2
  118. #define VMASK  0x4
  119. #define SMASK  0x8
  120. #define BMASK  0x10
  121. #define ZMASK  0x20
  122. #define TMASK  0x40
  123.  
  124. #define SPREAD_BIT (1L << 16)
  125. #define INTEGER_BIT (1L << 17)
  126. #define TITLE_BIT (1L << 18)
  127.  
  128. #define LOADPICTURE_MSG 0x1
  129. #define SAVEPICTURE_MSG 0x2
  130. #define DUMP_MSG        0x4
  131. #define REDRAW_MSG      0x8
  132. #define UNDO_MSG        0x10
  133. #define DRAW_MSG        0x20
  134. #define PREVIEW_MSG     0x40
  135. #define NEWDISPLAY_MSG  0x80
  136. #define STOP_MSG        0x100
  137. #define EXIT_MSG        0x200
  138. #define COORDS_MSG      0x400
  139. #define ITER_MSG        0x800
  140. #define ABOUT_MSG       0x1000
  141. #define TITLE_MSG       0x2000
  142. #define TIME_MSG        0x4000
  143. #define PALETTE_MSG     0x8000
  144. #define CYCLERIGHT_MSG  0x10000
  145. #define CYCLELEFT_MSG   0x20000
  146. #define DELAY_MSG       0x40000
  147. #define COLOR_MSG       0x80000
  148. #define LOADPALETTE_MSG 0x100000
  149. #define SAVEPALETTE_MSG 0x200000
  150. #define FONTREQ_MSG     0x400000
  151.  
  152. #define PICTURES_DRAWER 0
  153. #define PALETTES_DRAWER 1
  154.  
  155. #define IDCMP_STANDARD  IDCMP_CLOSEWINDOW|IDCMP_RAWKEY|IDCMP_MOUSEBUTTONS|IDCMP_MOUSEMOVE|IDCMP_MENUPICK
  156.  
  157. #define WFLG_STANDARD WFLG_ACTIVATE|WFLG_BACKDROP|WFLG_NOCAREREFRESH|WFLG_SMART_REFRESH|WFLG_BORDERLESS|WFLG_REPORTMOUSE|WFLG_NEWLOOKMENUS
  158.  
  159. #define TEXT_ALERT_POS  "\x00\x90\x10 FlashMandel message: "
  160.  
  161. #define MODE_ID_MASK (LACE|HIRES|HAM|EXTRA_HALFBRITE)
  162.  
  163. #define ID_MAND MAKE_ID('M','A','N','D')
  164.  
  165. struct MandelChunk { WORD LeftEdge,TopEdge,Width,Height;
  166.                      long double RMin,RMax,IMin,IMax;
  167.                      long double RConst,IConst;
  168.                      ULONG Iterations;
  169.                      ULONG Special;
  170.                    };
  171.  
  172. IMPORT struct ExecBase *SysBase;
  173.  
  174. TEXT VERSION_STRING [] = "\0$VER: " VERSION DATE "\r\n by " AUTHOR;
  175.  
  176. TEXT MYFILE [80],PICTURESDIR [220],PALETTESDIR [220],MYPATH [300],BAR_STRING [80],*MYDIR = NULL;
  177.  
  178. BOOL SPREAD = TRUE;
  179.  
  180. WORD ZOOMLINE [PAIRS << 1] , PRIORITY = 0 , MAX_ITERATIONS = 319;
  181.  
  182. UWORD MAX_ITERATIONS_PLUS_ONE;
  183.  
  184. LONG __oslibversion = 39L;
  185.  
  186. ULONG RETURNVALUE = NULL,MASK = TMASK;
  187.  
  188. ULONG ELAPSEDTIME = NULL,DELAY = 5L,COLOR_PENS;
  189.  
  190. long double RMIN=INIT_DEF_RMIN,RMAX=INIT_DEF_RMAX,IMIN=INIT_DEF_IMIN,IMAX=INIT_DEF_IMAX;
  191.  
  192. long double DEF_RMIN,DEF_RMAX,DEF_IMIN,DEF_IMAX,URMIN,URMAX,UIMIN,UIMAX;
  193.  
  194. long double FACTOR=0.0,INCREMREAL=0.0,INCREMIMAG=0.0,CRE=0.0,CIM=0.0;
  195.  
  196. ULONG *PALETTE;
  197.  
  198. WORD (*FUNCTION) (WORD,long double,long double);
  199.  
  200. VOID (*V_LINE) (struct RastPort *,const LONG,const LONG,const LONG);
  201.  
  202. VOID (*H_LINE) (struct RastPort *,const LONG,const LONG,const LONG);
  203.  
  204. CPTR *VINFO = NULL;
  205.  
  206. UBYTE *OpenDisplayError       = TEXT_ALERT_POS "I need at least 8 colors, sorry." "\x00";
  207. UBYTE *FontError              = TEXT_ALERT_POS "Font failed" "\x00";
  208. UBYTE *NoMonitor              = TEXT_ALERT_POS "No monitor" "\x00";
  209. UBYTE *NoChips                = TEXT_ALERT_POS "No chips" "\x00";
  210. UBYTE *NoMem                  = TEXT_ALERT_POS "No mem" "\x00";
  211. UBYTE *NoChipMem              = TEXT_ALERT_POS "No chipmem" "\x00";
  212. UBYTE *PubNotUnique           = TEXT_ALERT_POS "Pub not unique" "\x00";
  213. UBYTE *UnknownMode            = TEXT_ALERT_POS "Unknown mode" "\x00";
  214. UBYTE *ScreenTooDeep          = TEXT_ALERT_POS "Screen too deep" "\x00";
  215. UBYTE *AttachScreen           = TEXT_ALERT_POS "Attach screen failed" "\x00";
  216. UBYTE *ModeNotAvailableError  = TEXT_ALERT_POS "Mode not available" "\x00";
  217. UBYTE *UnknownScrError        = TEXT_ALERT_POS "Unknown screen error" "\x00";
  218. UBYTE *VisualInfoError        = TEXT_ALERT_POS "Visualinfo failed" "\x00";
  219. UBYTE *WindowError            = TEXT_ALERT_POS "Openwindow failed" "\x00";
  220. UBYTE *MenuError              = TEXT_ALERT_POS "Menu failed" "\x00";
  221. UBYTE *GadgetError            = TEXT_ALERT_POS "Gadget error" "\x00";
  222. UBYTE *WindowGadgetError      = TEXT_ALERT_POS "Window gadget error" "\x00";
  223. UBYTE *PreviewWindowError     = TEXT_ALERT_POS "Preview window failed" "\x00";
  224. UBYTE *CreateDisplayError     = TEXT_ALERT_POS "Createdisplay error" "\x00";
  225. UBYTE *DimensionInfoError     = TEXT_ALERT_POS "Dimensioninfo error" "\x00";
  226. UBYTE *DisplayInfoError       = TEXT_ALERT_POS "Displayinfo error" "\x00";
  227. UBYTE *PaletteRequesterError  = TEXT_ALERT_POS "Palette requester error" "\x00";
  228. UBYTE *OpenDiskFontError      = TEXT_ALERT_POS "Selected font not loaded" "\x00";
  229. UBYTE *MakeDisplayError       = TEXT_ALERT_POS "Display error" "\x00";
  230. UBYTE *QueryMandPicError      = TEXT_ALERT_POS "Not a FlashMandel picture !" "\x00";
  231. UBYTE *LoadMandPicError       = TEXT_ALERT_POS "Load picture error" "\x00";
  232. UBYTE *SaveMandPicError       = TEXT_ALERT_POS "Save picture error" "\x00";
  233.  
  234. VOID   PutPointer    (struct Window *,UWORD *,WORD,WORD,WORD,WORD,UBYTE);
  235. VOID   ClipIt        (WORD,WORD,struct Rectangle *,struct Rectangle *,struct Rectangle *,struct Rectangle *,struct Rectangle *,struct Rectangle *,BOOL);
  236. ULONG  ModeFallBack  (ULONG,WORD,WORD,WORD);
  237. LONG   About         (struct Window *);
  238. LONG   Choice        (struct Window *,TEXT *,TEXT *);
  239. LONG   CheckGFX      (VOID);
  240. BOOL   CheckEHB      (ULONG);
  241. UBYTE  GetMaxPlanes  (ULONG);
  242. ULONG  CheckFPU      (UWORD);
  243. VOID   AdjustRatio   (long double *,long double *,long double *,long double *,WORD,WORD,BOOL);
  244. WORD   Integer       (WORD,long double,long double);
  245. WORD   Real          (WORD,long double,long double);
  246. VOID   ShowTime      (struct Window *,TEXT *,ULONG);
  247. ULONG  IntegerGad    (struct Window *,TEXT *,TEXT *,TEXT *,ULONG);
  248. VOID   CloseDisplay  (struct ILBMInfo *,CPTR *);
  249. LONG   MakeDisplay   (struct ILBMInfo *);
  250. VOID   VLine_R_EHB   (struct RastPort *,const LONG,const LONG,const LONG);
  251. VOID   HLine_R_EHB   (struct RastPort *,const LONG,const LONG,const LONG);
  252. VOID   VLine_S_EHB   (struct RastPort *,const LONG,const LONG,const LONG);
  253. VOID   HLine_S_EHB   (struct RastPort *,const LONG,const LONG,const LONG);
  254. VOID   VLine_R       (struct RastPort *,const LONG,const LONG,const LONG);
  255. VOID   HLine_R       (struct RastPort *,const LONG,const LONG,const LONG);
  256. VOID   VLine_S       (struct RastPort *,const LONG,const LONG,const LONG);
  257. VOID   HLine_S       (struct RastPort *,const LONG,const LONG,const LONG);
  258. BOOL   CheckBox      (struct RastPort *,const LONG,const LONG,const LONG,const LONG);
  259. BOOL   Rectangle     (struct Window *,const LONG,const LONG,const LONG,const LONG);
  260. BOOL   NewCoords     (struct Window *,const LONG,const LONG,const LONG,const LONG);
  261. BOOL   DrawFrame     (struct Window *,WORD,WORD,WORD,WORD);
  262. ULONG  DrawFractal   (struct Window *,const LONG,const LONG,const LONG,const LONG);
  263. BOOL   Preview       (struct Window *,const LONG,const LONG);
  264. BOOL   ShowCoords    (struct Window *);
  265. VOID   RestoreCoords (VOID);
  266. VOID   SaveCoords    (VOID);
  267. BOOL   FileRequest   (struct Window *,TEXT *,TEXT *,BOOL,BOOL);
  268. BOOL   FontRequest   (struct Window *);
  269. BOOL   SMRequest     (struct ILBMInfo *);
  270. VOID   SetMenuStart  (struct Window *);
  271. VOID   SetMenuStop   (struct Window *);
  272. ULONG  ProcessMenu   (struct Window *,UWORD);
  273. VOID   ProcessMouse  (struct Window *,WORD,WORD);
  274. ULONG  HandleEvents  (struct ILBMInfo *);
  275. LONG   WinDump       (struct Window *);
  276. ULONG  Fail          (UBYTE *,ULONG);
  277. BOOL   PasteWin      (struct BitMap *,struct Window *,WORD,WORD);
  278. LONG   main          (ULONG,UBYTE **);
  279.  
  280. LONG __asm __interrupt __saveds SMFilterFunc (register __a0 struct Hook *,register __a1 ULONG,register __a2 struct ScreenModeRequester *);
  281.  
  282. struct Screen *OpenIdScreen (struct ILBMInfo *,WORD,WORD,WORD,ULONG);
  283. struct Window *OpenDisplay  (struct ILBMInfo *,WORD,WORD,WORD,ULONG);
  284. struct BitMap *CopyBitMap   (struct Window *,WORD,WORD,WORD,WORD);
  285.  
  286. struct Hook         SMFILTERHOOK      = {NULL,NULL,(VOID *) SMFilterFunc,NULL};
  287.  
  288. struct Border       MYBORDER          = {0,0,0,0,COMPLEMENT,PAIRS,ZOOMLINE,0};
  289.  
  290. struct TextAttr     MYFONTSTRUCT      = {"topaz.font",8,FS_NORMAL,FPF_ROMFONT};
  291.  
  292. struct NewGadget    TEXTGAD           = {0,0,0,0,0,&MYFONTSTRUCT,0,0,0,0};
  293.  
  294. struct NewGadget    BUTTONGAD         = {0,0,0,0,0,&MYFONTSTRUCT,0,0,0,0};
  295.  
  296. struct NewGadget    CHECKBOXGAD       = {0,0,0,0,0,&MYFONTSTRUCT,0,0,0,0};
  297.  
  298. struct BitScaleArgs BSA               = {0,0,0,0,0,0,0,0,0,0,0,0,NULL,NULL,NULL,0,0,NULL,NULL};
  299.  
  300. struct Chunk        COPYRIGHT_CHUNK   = {NULL,ID_ILBM,ID_Copyright,IFFSIZE_UNKNOWN,"\n\n" VERSION COPYRIGHT " by " AUTHOR "\n\n"};
  301.  
  302. struct Chunk        SPECIAL_CHUNK     = {NULL,ID_ILBM,ID_MAND,sizeof (struct MandelChunk),NULL};
  303.  
  304. UWORD PENS [] = {BLACK,DARK_GREY,WHITE,WHITE,DARK_GREY,LIGHT_GREY,DARK_GREY,LIGHT_GREY,DARK_GREY,WHITE,LIGHT_GREY,DARK_GREY,(UWORD) ~0};
  305.  
  306. /*
  307.  
  308. 01    0 DETAILPEN             SFONDO
  309. 02    1 BLOCKPEN              TESTO
  310. 03    1 TEXTPEN               TESTO EVIDENZIATO
  311. 04    2 SHINEPEN              BORDI CHIARI
  312. 05    1 SHADOWPEN             BORDI SCURI
  313. 06    3 FILLPEN               BARRA TITOLO FINESTRE ATTIVE
  314. 07    1 FILLTEXTPEN           TITOLO FINESTRE ATTIVE
  315. 08    0 BACKGROUNDPEN
  316. 09    2 HIGHLIGHTTEXTPEN
  317.  
  318. 10    1 BARDETAILPEN          TESTO NEI MENU
  319. 11    2 BARBLOCKPEN           SFONDO NEI MENU
  320. 12    1 BARTRIMPEN
  321.  
  322. */
  323.  
  324. ULONG COLORS_32_ECS [] = {32L << 16L,
  325.                           0x00000000,0x00000000,0x00000000,
  326.                           0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,
  327.                           0xAAAAAAAA,0xAAAAAAAA,0xAAAAAAAA,
  328.                           0x66666666,0x66666666,0x66666666,
  329.                           0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,
  330.                           0xBBBBBBBB,0xBBBBBBBB,0xBBBBBBBB,
  331.                           0x77777777,0x77777777,0x77777777,
  332.                           0x33333333,0x33333333,0x33333333,
  333.                           0x33333333,0x33333333,0x00000000,
  334.                           0x77777777,0x77777777,0x00000000,
  335.                           0xBBBBBBBB,0xBBBBBBBB,0x00000000,
  336.                           0xFFFFFFFF,0xFFFFFFFF,0x00000000,
  337.                           0x00000000,0xFFFFFFFF,0x00000000,
  338.                           0x00000000,0xBBBBBBBB,0x00000000,
  339.                           0x00000000,0x77777777,0x00000000,
  340.                           0x00000000,0x33333333,0x00000000,
  341.                           0x33333333,0x00000000,0x33333333,
  342.                           0x77777777,0x00000000,0x77777777,
  343.                           0xBBBBBBBB,0x00000000,0xBBBBBBBB,
  344.                           0xFFFFFFFF,0x00000000,0xFFFFFFFF,
  345.                           0xFFFFFFFF,0x00000000,0x00000000,
  346.                           0xBBBBBBBB,0x00000000,0x00000000,
  347.                           0x77777777,0x00000000,0x00000000,
  348.                           0x33333333,0x00000000,0x00000000,
  349.                           0x00000000,0x33333333,0x33333333,
  350.                           0x00000000,0x77777777,0x77777777,
  351.                           0x00000000,0xBBBBBBBB,0xBBBBBBBB,
  352.                           0x00000000,0xFFFFFFFF,0xFFFFFFFF,
  353.                           0x00000000,0x00000000,0xFFFFFFFF,
  354.                           0x00000000,0x00000000,0xBBBBBBBB,
  355.                           0x00000000,0x00000000,0x77777777,
  356.                           0x00000000,0x00000000,0x33333333,
  357.                           NULL};
  358.  
  359. ULONG COLORS_32_AGA []  =  {256L << 16L,
  360.                             0x00000000,0x00000000,0x00000000, 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, 0xAAAAAAAA,0xAAAAAAAA,0xAAAAAAAA, 0x66666666,0x66666666,0x66666666,
  361.                             0x9f9f9f9f,0x9f9f9f9f,0x9f9f9f9f, 0xafafafaf,0xafafafaf,0xafafafaf, 0xbfbfbfbf,0xbfbfbfbf,0xbfbfbfbf, 0xcfcfcfcf,0xcfcfcfcf,0xcfcfcfcf,
  362.                             0xdfdfdfdf,0xdfdfdfdf,0xdfdfdfdf, 0xefefefef,0xefefefef,0xefefefef, 0xdfdfdfdf,0xefefefef,0xffffffff, 0xcfcfcfcf,0xdfdfdfdf,0xefefefef,
  363.                             0xbfbfbfbf,0xcfcfcfcf,0xdfdfdfdf, 0xafafafaf,0xbfbfbfbf,0xcfcfcfcf, 0x9f9f9f9f,0xafafafaf,0xbfbfbfbf, 0x8f8f8f8f,0x9f9f9f9f,0xafafafaf,
  364.                             0x7f7f7f7f,0x8f8f8f8f,0x9f9f9f9f, 0x6f6f6f6f,0x7f7f7f7f,0x8f8f8f8f, 0x5f5f5f5f,0x6f6f6f6f,0x7f7f7f7f, 0x4f4f4f4f,0x5f5f5f5f,0x6f6f6f6f,
  365.                             0x3f3f3f3f,0x4f4f4f4f,0x5f5f5f5f, 0x2f2f2f2f,0x3f3f3f3f,0x4f4f4f4f, 0x1f1f1f1f,0x2f2f2f2f,0x3f3f3f3f, 0x0f0f0f0f,0x1f1f1f1f,0x2f2f2f2f,
  366.                             0x00000000,0x0f0f0f0f,0x1f1f1f1f, 0x1f1f1f1f,0x0f0f0f0f,0x1f1f1f1f, 0x2f2f2f2f,0x1f1f1f1f,0x2f2f2f2f, 0x3f3f3f3f,0x2f2f2f2f,0x3f3f3f3f,
  367.                             0x4f4f4f4f,0x3f3f3f3f,0x4f4f4f4f, 0x5f5f5f5f,0x4f4f4f4f,0x5f5f5f5f, 0x6f6f6f6f,0x5f5f5f5f,0x6f6f6f6f, 0x7f7f7f7f,0x6f6f6f6f,0x7f7f7f7f,
  368.                             0x8f8f8f8f,0x7f7f7f7f,0x8f8f8f8f, 0x9f9f9f9f,0x8f8f8f8f,0x9f9f9f9f, 0xafafafaf,0x9f9f9f9f,0xafafafaf, 0xbfbfbfbf,0xafafafaf,0xbfbfbfbf,
  369.                             0xcfcfcfcf,0xbfbfbfbf,0xcfcfcfcf, 0xdfdfdfdf,0xcfcfcfcf,0xdfdfdfdf, 0xefefefef,0xdfdfdfdf,0xefefefef, 0xffffffff,0xefefefef,0xffffffff,
  370.                             0xefefefef,0xffffffff,0xefefefef, 0xdfdfdfdf,0xefefefef,0xdfdfdfdf, 0xcfcfcfcf,0xdfdfdfdf,0xcfcfcfcf, 0xbfbfbfbf,0xcfcfcfcf,0xbfbfbfbf,
  371.                             0xafafafaf,0xbfbfbfbf,0xafafafaf, 0x9f9f9f9f,0xafafafaf,0x9f9f9f9f, 0x8f8f8f8f,0x9f9f9f9f,0x8f8f8f8f, 0x7f7f7f7f,0x8f8f8f8f,0x7f7f7f7f,
  372.                             0x6f6f6f6f,0x7f7f7f7f,0x6f6f6f6f, 0x5f5f5f5f,0x6f6f6f6f,0x5f5f5f5f, 0x4f4f4f4f,0x5f5f5f5f,0x4f4f4f4f, 0x3f3f3f3f,0x4f4f4f4f,0x3f3f3f3f,
  373.                             0x2f2f2f2f,0x3f3f3f3f,0x2f2f2f2f, 0x1f1f1f1f,0x2f2f2f2f,0x1f1f1f1f, 0x0f0f0f0f,0x1f1f1f1f,0x0f0f0f0f, 0x0f0f0f0f,0x1f1f1f1f,0x1f1f1f1f,
  374.                             0x1f1f1f1f,0x2f2f2f2f,0x2f2f2f2f, 0x2f2f2f2f,0x3f3f3f3f,0x3f3f3f3f, 0x3f3f3f3f,0x4f4f4f4f,0x4f4f4f4f, 0x4f4f4f4f,0x5f5f5f5f,0x5f5f5f5f,
  375.                             0x5f5f5f5f,0x6f6f6f6f,0x6f6f6f6f, 0x6f6f6f6f,0x7f7f7f7f,0x7f7f7f7f, 0x7f7f7f7f,0x8f8f8f8f,0x8f8f8f8f, 0x8f8f8f8f,0x9f9f9f9f,0x9f9f9f9f,
  376.                             0x9f9f9f9f,0xafafafaf,0xafafafaf, 0xafafafaf,0xbfbfbfbf,0xbfbfbfbf, 0xbfbfbfbf,0xcfcfcfcf,0xcfcfcfcf, 0xcfcfcfcf,0xdfdfdfdf,0xdfdfdfdf,
  377.                             0xdfdfdfdf,0xefefefef,0xefefefef, 0xefefefef,0xffffffff,0xffffffff, 0xffffffff,0xefefefef,0xefefefef, 0xefefefef,0xdfdfdfdf,0xdfdfdfdf,
  378.                             0xdfdfdfdf,0xcfcfcfcf,0xcfcfcfcf, 0xcfcfcfcf,0xbfbfbfbf,0xbfbfbfbf, 0xbfbfbfbf,0xafafafaf,0xafafafaf, 0xafafafaf,0x9f9f9f9f,0x9f9f9f9f,
  379.                             0x9f9f9f9f,0x8f8f8f8f,0x8f8f8f8f, 0x8f8f8f8f,0x7f7f7f7f,0x7f7f7f7f, 0x7f7f7f7f,0x6f6f6f6f,0x6f6f6f6f, 0x6f6f6f6f,0x5f5f5f5f,0x5f5f5f5f,
  380.                             0x5f5f5f5f,0x4f4f4f4f,0x4f4f4f4f, 0x4f4f4f4f,0x3f3f3f3f,0x3f3f3f3f, 0x3f3f3f3f,0x2f2f2f2f,0x2f2f2f2f, 0x2f2f2f2f,0x1f1f1f1f,0x1f1f1f1f,
  381.                             0x1f1f1f1f,0x0f0f0f0f,0x0f0f0f0f, 0x1f1f1f1f,0x1f1f1f1f,0x0f0f0f0f, 0x2f2f2f2f,0x2f2f2f2f,0x1f1f1f1f, 0x3f3f3f3f,0x3f3f3f3f,0x2f2f2f2f,
  382.                             0x4f4f4f4f,0x4f4f4f4f,0x3f3f3f3f, 0x5f5f5f5f,0x5f5f5f5f,0x4f4f4f4f, 0x6f6f6f6f,0x6f6f6f6f,0x5f5f5f5f, 0x7f7f7f7f,0x7f7f7f7f,0x6f6f6f6f,
  383.                             0x8f8f8f8f,0x8f8f8f8f,0x7f7f7f7f, 0x9f9f9f9f,0x9f9f9f9f,0x8f8f8f8f, 0xafafafaf,0xafafafaf,0x9f9f9f9f, 0xbfbfbfbf,0xbfbfbfbf,0xafafafaf,
  384.                             0xcfcfcfcf,0xcfcfcfcf,0xbfbfbfbf, 0xdfdfdfdf,0xdfdfdfdf,0xcfcfcfcf, 0xefefefef,0xefefefef,0xdfdfdfdf, 0xffffffff,0xffffffff,0xefefefef,
  385.                             0xefefefef,0xefefefef,0xffffffff, 0xdfdfdfdf,0xdfdfdfdf,0xefefefef, 0xcfcfcfcf,0xcfcfcfcf,0xdfdfdfdf, 0xbfbfbfbf,0xbfbfbfbf,0xcfcfcfcf,
  386.                             0xafafafaf,0xafafafaf,0xbfbfbfbf, 0x9f9f9f9f,0x9f9f9f9f,0xafafafaf, 0x8f8f8f8f,0x8f8f8f8f,0x9f9f9f9f, 0x7f7f7f7f,0x7f7f7f7f,0x8f8f8f8f,
  387.                             0x6f6f6f6f,0x6f6f6f6f,0x7f7f7f7f, 0x5f5f5f5f,0x5f5f5f5f,0x6f6f6f6f, 0x4f4f4f4f,0x4f4f4f4f,0x5f5f5f5f, 0x3f3f3f3f,0x3f3f3f3f,0x4f4f4f4f,
  388.                             0x2f2f2f2f,0x2f2f2f2f,0x3f3f3f3f, 0x1f1f1f1f,0x1f1f1f1f,0x2f2f2f2f, 0x0f0f0f0f,0x0f0f0f0f,0x1f1f1f1f, 0x0f0f0f0f,0x0f0f0f0f,0x00000000,
  389.                             0x1f1f1f1f,0x1f1f1f1f,0x00000000, 0x2f2f2f2f,0x2f2f2f2f,0x00000000, 0x3f3f3f3f,0x3f3f3f3f,0x00000000, 0x4f4f4f4f,0x4f4f4f4f,0x00000000,
  390.                             0x5f5f5f5f,0x5f5f5f5f,0x00000000, 0x6f6f6f6f,0x6f6f6f6f,0x00000000, 0x7f7f7f7f,0x7f7f7f7f,0x00000000, 0x8f8f8f8f,0x8f8f8f8f,0x00000000,
  391.                             0x9f9f9f9f,0x9f9f9f9f,0x00000000, 0xafafafaf,0xafafafaf,0x00000000, 0xbfbfbfbf,0xbfbfbfbf,0x00000000, 0xcfcfcfcf,0xcfcfcfcf,0x00000000,
  392.                             0xdfdfdfdf,0xdfdfdfdf,0x00000000, 0xefefefef,0xefefefef,0x00000000, 0xffffffff,0xffffffff,0x00000000, 0xefefefef,0xffffffff,0x00000000,
  393.                             0xdfdfdfdf,0xffffffff,0x00000000, 0xcfcfcfcf,0xffffffff,0x00000000, 0xbfbfbfbf,0xffffffff,0x00000000, 0xafafafaf,0xffffffff,0x00000000,
  394.                             0x9f9f9f9f,0xffffffff,0x00000000, 0x8f8f8f8f,0xffffffff,0x00000000, 0x7f7f7f7f,0xffffffff,0x00000000, 0x6f6f6f6f,0xffffffff,0x00000000,
  395.                             0x5f5f5f5f,0xffffffff,0x00000000, 0x4f4f4f4f,0xffffffff,0x00000000, 0x3f3f3f3f,0xffffffff,0x00000000, 0x2f2f2f2f,0xffffffff,0x00000000,
  396.                             0x1f1f1f1f,0xffffffff,0x00000000, 0x0f0f0f0f,0xffffffff,0x00000000, 0x00000000,0xffffffff,0x00000000, 0x00000000,0xefefefef,0x00000000,
  397.                             0x00000000,0xdfdfdfdf,0x00000000, 0x00000000,0xcfcfcfcf,0x00000000, 0x00000000,0xbfbfbfbf,0x00000000, 0x00000000,0xafafafaf,0x00000000,
  398.                             0x00000000,0x9f9f9f9f,0x00000000, 0x00000000,0x8f8f8f8f,0x00000000, 0x00000000,0x7f7f7f7f,0x00000000, 0x00000000,0x6f6f6f6f,0x00000000,
  399.                             0x00000000,0x5f5f5f5f,0x00000000, 0x00000000,0x4f4f4f4f,0x00000000, 0x00000000,0x3f3f3f3f,0x00000000, 0x00000000,0x2f2f2f2f,0x00000000,
  400.                             0x00000000,0x1f1f1f1f,0x00000000, 0x00000000,0x0f0f0f0f,0x00000000, 0x0f0f0f0f,0x00000000,0x0f0f0f0f, 0x1f1f1f1f,0x00000000,0x1f1f1f1f,
  401.                             0x2f2f2f2f,0x00000000,0x2f2f2f2f, 0x3f3f3f3f,0x00000000,0x3f3f3f3f, 0x4f4f4f4f,0x00000000,0x4f4f4f4f, 0x5f5f5f5f,0x00000000,0x5f5f5f5f,
  402.                             0x6f6f6f6f,0x00000000,0x6f6f6f6f, 0x7f7f7f7f,0x00000000,0x7f7f7f7f, 0x8f8f8f8f,0x00000000,0x8f8f8f8f, 0x9f9f9f9f,0x00000000,0x9f9f9f9f,
  403.                             0xafafafaf,0x00000000,0xafafafaf, 0xbfbfbfbf,0x00000000,0xbfbfbfbf, 0xcfcfcfcf,0x00000000,0xcfcfcfcf, 0xdfdfdfdf,0x00000000,0xdfdfdfdf,
  404.                             0xefefefef,0x00000000,0xefefefef, 0xffffffff,0x00000000,0xffffffff, 0xffffffff,0x00000000,0xefefefef, 0xffffffff,0x00000000,0xdfdfdfdf,
  405.                             0xffffffff,0x00000000,0xcfcfcfcf, 0xffffffff,0x00000000,0xbfbfbfbf, 0xffffffff,0x00000000,0xafafafaf, 0xffffffff,0x00000000,0x9f9f9f9f,
  406.                             0xffffffff,0x00000000,0x8f8f8f8f, 0xffffffff,0x00000000,0x7f7f7f7f, 0xffffffff,0x00000000,0x6f6f6f6f, 0xffffffff,0x00000000,0x5f5f5f5f,
  407.                             0xffffffff,0x00000000,0x4f4f4f4f, 0xffffffff,0x00000000,0x3f3f3f3f, 0xffffffff,0x00000000,0x2f2f2f2f, 0xffffffff,0x00000000,0x1f1f1f1f,
  408.                             0xffffffff,0x00000000,0x0f0f0f0f, 0xffffffff,0x00000000,0x00000000, 0xefefefef,0x00000000,0x00000000, 0xdfdfdfdf,0x00000000,0x00000000,
  409.                             0xcfcfcfcf,0x00000000,0x00000000, 0xbfbfbfbf,0x00000000,0x00000000, 0xafafafaf,0x00000000,0x00000000, 0x9f9f9f9f,0x00000000,0x00000000,
  410.                             0x8f8f8f8f,0x00000000,0x00000000, 0x7f7f7f7f,0x00000000,0x00000000, 0x6f6f6f6f,0x00000000,0x00000000, 0x5f5f5f5f,0x00000000,0x00000000,
  411.                             0x4f4f4f4f,0x00000000,0x00000000, 0x3f3f3f3f,0x00000000,0x00000000, 0x2f2f2f2f,0x00000000,0x00000000, 0x1f1f1f1f,0x00000000,0x00000000,
  412.                             0x0f0f0f0f,0x00000000,0x00000000, 0x00000000,0x0f0f0f0f,0x0f0f0f0f, 0x00000000,0x1f1f1f1f,0x1f1f1f1f, 0x00000000,0x2f2f2f2f,0x2f2f2f2f,
  413.                             0x00000000,0x3f3f3f3f,0x3f3f3f3f, 0x00000000,0x4f4f4f4f,0x4f4f4f4f, 0x00000000,0x5f5f5f5f,0x5f5f5f5f, 0x00000000,0x6f6f6f6f,0x6f6f6f6f,
  414.                             0x00000000,0x7f7f7f7f,0x7f7f7f7f, 0x00000000,0x8f8f8f8f,0x8f8f8f8f, 0x00000000,0x9f9f9f9f,0x9f9f9f9f, 0x00000000,0xafafafaf,0xafafafaf,
  415.                             0x00000000,0xbfbfbfbf,0xbfbfbfbf, 0x00000000,0xcfcfcfcf,0xcfcfcfcf, 0x00000000,0xdfdfdfdf,0xdfdfdfdf, 0x00000000,0xefefefef,0xefefefef,
  416.                             0x00000000,0xffffffff,0xffffffff, 0x00000000,0xefefefef,0xffffffff, 0x00000000,0xdfdfdfdf,0xffffffff, 0x00000000,0xcfcfcfcf,0xffffffff,
  417.                             0x00000000,0xbfbfbfbf,0xffffffff, 0x00000000,0xafafafaf,0xffffffff, 0x00000000,0x9f9f9f9f,0xffffffff, 0x00000000,0x8f8f8f8f,0xffffffff,
  418.                             0x00000000,0x7f7f7f7f,0xffffffff, 0x00000000,0x6f6f6f6f,0xffffffff, 0x00000000,0x5f5f5f5f,0xffffffff, 0x00000000,0x4f4f4f4f,0xffffffff,
  419.                             0x00000000,0x3f3f3f3f,0xffffffff, 0x00000000,0x2f2f2f2f,0xffffffff, 0x00000000,0x1f1f1f1f,0xffffffff, 0x00000000,0x0f0f0f0f,0xffffffff,
  420.                             0x00000000,0x00000000,0xffffffff, 0x00000000,0x00000000,0xefefefef, 0x00000000,0x00000000,0xdfdfdfdf, 0x00000000,0x00000000,0xcfcfcfcf,
  421.                             0x00000000,0x00000000,0xbfbfbfbf, 0x00000000,0x00000000,0xafafafaf, 0x00000000,0x00000000,0x9f9f9f9f, 0x00000000,0x00000000,0x8f8f8f8f,
  422.                             0x00000000,0x00000000,0x7f7f7f7f, 0x00000000,0x00000000,0x6f6f6f6f, 0x00000000,0x00000000,0x5f5f5f5f, 0x00000000,0x00000000,0x4f4f4f4f,
  423.                             0x00000000,0x00000000,0x3f3f3f3f, 0x00000000,0x00000000,0x2f2f2f2f, 0x00000000,0x00000000,0x1f1f1f1f, 0x00000000,0x00000000,0x0f0f0f0f,
  424.                             NULL};
  425.  
  426. UWORD chip ZZZPointer[]  = {0x0000,0x0000,0x0400,0x07C0,0x0000,0x07C0,0x0100,0x0380,
  427.                             0x0000,0x07E0,0x07C0,0x1FF8,0x1FF0,0x3FEC,0x3FF8,0x7FDE,
  428.                             0x3FF8,0x7FBE,0x7FFC,0xFF7F,0x7EFC,0xFFFF,0x7FFC,0xFFFF,
  429.                             0x3FF8,0x7FFE,0x3FF8,0x7FFE,0x1FF0,0x3FFC,0x07C0,0x1FF8,
  430.                             0x0000,0x07E0,0x0000,0x0000};
  431.  
  432. UWORD chip ZoomPointer[] = {0x0000,0x0000,0x0100,0x0000,0x0100,0x0000,0x0000,0x0100,
  433.                             0x0000,0x0100,0x0100,0x0100,0x0100,0x0100,0x0000,0x0000,
  434.                             0xCC66,0x3C78,0x0000,0x0000,0x0100,0x0100,0x0100,0x0100,
  435.                             0x0000,0x0100,0x0000,0x0100,0x0100,0x0000,0x0100,0x0000,
  436.                             0x0000,0x0000};
  437.  
  438. struct NewMenu ProgMenu[] = { NM_TITLE,"Project",0,0,0,0,
  439.  
  440.                               NM_ITEM,"About...","A",NM_ITEMDISABLED,0,0,
  441.  
  442.                               NM_ITEM,NM_BARLABEL,0,0,0,0,
  443.  
  444.                               NM_ITEM,"Load picture...","L",NM_ITEMDISABLED,0,0,
  445.  
  446.                               NM_ITEM,"Save picture...","S",NM_ITEMDISABLED,0,0,
  447.  
  448.                               NM_ITEM,"Load palette...","K",NM_ITEMDISABLED,0,0,
  449.  
  450.                               NM_ITEM,"Save palette...","J",NM_ITEMDISABLED,0,0,
  451.  
  452.                               NM_ITEM,NM_BARLABEL,0,0,0,0,
  453.  
  454.                               NM_ITEM,"Print...","D",NM_ITEMDISABLED,0,0,
  455.  
  456.                               NM_ITEM,NM_BARLABEL,0,0,0,0,
  457.  
  458.                               NM_ITEM,"Quit...","Q",NM_ITEMDISABLED,0,0,
  459.  
  460. /***************************************************************************************/
  461.  
  462.                               NM_TITLE,"Options",0,0,0,0,
  463.  
  464.                               NM_ITEM,"Title",0,NM_ITEMDISABLED,0,0,
  465.                               NM_SUB,"Title bar","O",CHECKIT|MENUTOGGLE|CHECKED,0,0,
  466.                               NM_SUB,NM_BARLABEL,0,0,0,0,
  467.                               NM_SUB,"Last time","T",0,0,0,
  468.  
  469.                               NM_ITEM,"Limits...","C",NM_ITEMDISABLED,0,0,
  470.  
  471.                               NM_ITEM,"Iterations",0,NM_ITEMDISABLED,0,0,
  472.                               NM_SUB,"64",0,CHECKIT,~(1<<0),0,
  473.                               NM_SUB,"128",0,CHECKIT,~(1<<1),0,
  474.                               NM_SUB,"192",0,CHECKIT,~(1<<2),0,
  475.                               NM_SUB,"256",0,CHECKIT,~(1<<3),0,
  476.                               NM_SUB,"320",0,CHECKIT|CHECKED,~(1<<4),0,
  477.                               NM_SUB,"384",0,CHECKIT,~(1<<5),0,
  478.                               NM_SUB,"448",0,CHECKIT,~(1<<6),0,
  479.                               NM_SUB,"512",0,CHECKIT,~(1<<7),0,
  480.                               NM_SUB,"1024",0,CHECKIT,~(1<<8),0,
  481.                               NM_SUB,NM_BARLABEL,0,0,0,0,
  482.                               NM_SUB,"Custom...","I",CHECKIT,~(1<<10),0,
  483.  
  484.                               NM_ITEM,"Priority",0,0,0,0,
  485.                               NM_SUB,"-5","%",CHECKIT,~(1<<0),0,
  486.                               NM_SUB,"-4","$",CHECKIT,~(1<<1),0,
  487.                               NM_SUB,"-3","£",CHECKIT,~(1<<2),0,
  488.                               NM_SUB,"-2","\"",CHECKIT,~(1<<3),0,
  489.                               NM_SUB,"-1","!",CHECKIT,~(1<<4),0,
  490.                               NM_SUB,NM_BARLABEL,0,0,0,0,
  491.                               NM_SUB," 0","0",CHECKIT|CHECKED,~(1<<6),0,
  492.                               NM_SUB,NM_BARLABEL,0,0,0,0,
  493.                               NM_SUB,"+1","1",CHECKIT,~(1<<8),0,
  494.                               NM_SUB,"+2","2",CHECKIT,~(1<<9),0,
  495.                               NM_SUB,"+3","3",CHECKIT,~(1<<10),0,
  496.                               NM_SUB,"+4","4",CHECKIT,~(1<<11),0,
  497.                               NM_SUB,"+5","5",CHECKIT,~(1<<12),0,
  498.  
  499.                               NM_ITEM,"Color mapping",0,0,0,0,
  500.                               NM_SUB,"Repeated",0,CHECKIT,~(1<<0),0,
  501.                               NM_SUB,"Spread",0,CHECKIT|CHECKED,~(1<<1),0,
  502.  
  503.                               NM_ITEM,"Precision",0,0,0,0,
  504.                               NM_SUB,"Integer",0,CHECKIT|CHECKED,~(1<<0),0,
  505.                               NM_SUB,"Real",0,CHECKIT,~(1<<1),0,
  506.  
  507. /***************************************************************************************/
  508.  
  509.                               NM_TITLE,"Calculate",0,0,0,0,
  510.  
  511.                               NM_ITEM,"PreView","W",NM_ITEMDISABLED,0,0,
  512.  
  513.                               NM_ITEM,NM_BARLABEL,0,0,0,0,
  514.  
  515.                               NM_ITEM,"ReCalculate","R",NM_ITEMDISABLED,0,0,
  516.  
  517.                               NM_ITEM,NM_BARLABEL,0,0,0,0,
  518.  
  519.                               NM_ITEM,"Undo","U",NM_ITEMDISABLED,0,0,
  520.  
  521.                               NM_ITEM,NM_BARLABEL,0,0,0,0,
  522.  
  523.                               NM_ITEM,"Zoom","Z",NM_ITEMDISABLED,0,0,
  524.  
  525.                               NM_ITEM,"Stop","X",0,0,0,
  526.  
  527. /***************************************************************************************/
  528.  
  529.                               NM_TITLE,"Video",0,0,0,0,
  530.  
  531.                               NM_ITEM,"Cycle",0,NM_ITEMDISABLED,0,0,
  532.                               NM_SUB,"Forward",">",0,0,0,
  533.                               NM_SUB,"Backward","<",0,0,0,
  534.                               NM_SUB,NM_BARLABEL,0,0,0,0,
  535.                               NM_SUB,"Delay...","-",0,0,0,
  536.  
  537.                               NM_ITEM,NM_BARLABEL,0,0,0,0,
  538.  
  539.                               NM_ITEM,"Palette...","P",NM_ITEMDISABLED,0,0,
  540.  
  541.                               NM_ITEM,NM_BARLABEL,0,0,0,0,
  542.  
  543.                               NM_ITEM,"Screen mode...","V",NM_ITEMDISABLED,0,0,
  544.  
  545.                               NM_ITEM,NM_BARLABEL,0,0,0,0,
  546.  
  547.                               NM_ITEM,"Font settings...","F",NM_ITEMDISABLED,0,0,
  548.  
  549.                               NM_END,0,0,0,0,0 };
  550.  
  551.  
  552. struct Menu *MAINMENU = NULL;
  553.  
  554. struct BitMap *MYBITMAP = NULL;
  555.  
  556. struct Task *THISTASK = NULL;
  557.  
  558. struct TextFont *NEWFONT = NULL;
  559.  
  560. struct ILBMInfo MYILBM;
  561.  
  562. struct MandelChunk MANDChunk;
  563.  
  564. struct MandelChunk *MANDChunkTmp = NULL;
  565.  
  566. LONG IlbmProps [] = { ID_ILBM, ID_BMHD, ID_ILBM, ID_CMAP, ID_ILBM, ID_CAMG, ID_ILBM, ID_MAND, TAG_END };
  567.  
  568. LONG IlbmCollects [] = { TAG_END };
  569.  
  570. LONG IlbmStops [] = { ID_ILBM, ID_BODY, TAG_END };
  571.  
  572. #ifdef __USE_FPU
  573.  
  574. IMPORT WORD __asm MandFPU (register __d0 WORD,register __fp0 long double,register __fp1 long double);
  575.  
  576. #endif
  577.  
  578. IMPORT WORD __asm MandINT (register __d0 WORD,register __d1 LONG,register __d2 LONG);
  579.  
  580. IMPORT BOOL ModifyPalette (struct Window *,WORD,WORD,WORD,WORD,ULONG *);
  581.  
  582. IMPORT BOOL Cycle (struct Window *,ULONG,BOOL);
  583.  
  584. IMPORT LONG QueryMandPic (struct ILBMInfo *,struct MandelChunk **,UBYTE *);
  585.  
  586. IMPORT LONG LoadMandPic (struct ILBMInfo *,UBYTE *);
  587.  
  588. IMPORT LONG SaveMandPic (struct ILBMInfo *,struct Chunk *,struct Chunk *,UBYTE *);
  589.  
  590. IMPORT LONG LoadPalette (struct ILBMInfo *,UBYTE *);
  591.  
  592. IMPORT LONG SavePalette (struct ILBMInfo *,struct Chunk *,UBYTE *);
  593.  
  594. VOID PutPointer (struct Window *Win,UWORD *PointerImage,WORD Width,WORD Height,WORD XOrigin,WORD YOrigin,UBYTE Type)
  595. {
  596.   switch (Type)
  597.   {
  598.      case 0: SetWindowPointer (Win,TAG_END);
  599.  
  600.              break;
  601.  
  602.      case 1: SetWindowPointer (Win,WA_BusyPointer,TRUE,WA_PointerDelay,TRUE,TAG_END);
  603.  
  604.              break;
  605.  
  606.     default: SetPointer (Win,PointerImage,Height,Width,XOrigin,YOrigin);
  607.   }
  608. }
  609.  
  610. UBYTE GetMaxPlanes (ULONG ModeID)
  611. {
  612. DisplayInfoHandle DisplayHandle;
  613.  
  614. struct DimensionInfo DimensionInfo;
  615.  
  616. UBYTE Planes = 0;
  617.  
  618.   DisplayHandle = FindDisplayInfo (ModeID);
  619.  
  620.   if (GetDisplayInfoData (DisplayHandle,(UBYTE *) &DimensionInfo,sizeof (struct DimensionInfo),DTAG_DIMS,ModeID))
  621.   {
  622.      Planes = DimensionInfo.MaxDepth;
  623.   }
  624.  
  625.   else Fail (DimensionInfoError,20L);
  626.  
  627.   return Planes;
  628. }
  629.  
  630. LONG CheckGFX (VOID)
  631. {
  632. DisplayInfoHandle DisplayHandle;
  633.  
  634. struct DisplayInfo DisplayInfo;
  635.  
  636. BOOL AGA = FALSE,RTG = FALSE;
  637.  
  638. ULONG ModeID = INVALID_ID;
  639.  
  640.   if (GetMaxPlanes (LORES_KEY) == MAX_DEPTH) AGA = TRUE;
  641.  
  642.   while (((ModeID = NextDisplayInfo (ModeID)) != INVALID_ID) && RTG == FALSE)
  643.   {
  644.         DisplayHandle = FindDisplayInfo (ModeID);
  645.  
  646.         if (GetDisplayInfoData (DisplayHandle,(UBYTE *) &DisplayInfo,sizeof (struct DisplayInfo),DTAG_DISP,ModeID))
  647.         {
  648.            if ((DisplayInfo.PropertyFlags & DIPF_IS_FOREIGN) && (GetMaxPlanes (ModeID) >= MAX_DEPTH)) RTG = TRUE;
  649.         }
  650.   }
  651.  
  652.   if (RTG && AGA) return 3L;
  653.  
  654.   if (RTG) return 2L;
  655.  
  656.   if (AGA) return 1L;
  657.  
  658.   return NULL;
  659. }
  660.  
  661. BOOL CheckEHB (ULONG ModeID)
  662. {
  663. DisplayInfoHandle DisplayHandle;
  664.  
  665. struct DisplayInfo DisplayInfo;
  666.  
  667. BOOL IsEHB = FALSE;
  668.  
  669.   DisplayHandle = FindDisplayInfo (ModeID);
  670.  
  671.   if (GetDisplayInfoData (DisplayHandle,(UBYTE *) &DisplayInfo,sizeof (struct DisplayInfo),DTAG_DISP,ModeID))
  672.   {
  673.      if (DisplayInfo.PropertyFlags & DIPF_IS_EXTRAHALFBRITE) IsEHB = TRUE;
  674.   }
  675.  
  676.   else Fail (DisplayInfoError,20L);
  677.  
  678.   return IsEHB;
  679. }
  680.  
  681. ULONG CheckFPU (UWORD CpuFlags)
  682. {
  683.   if (AFF_68060 & CpuFlags) return 68884L;
  684.  
  685.   if (AFF_FPU40 & CpuFlags) return 68883L;
  686.  
  687.   if (AFF_68882 & CpuFlags) return 68882L;
  688.  
  689.   if (AFF_68881 & CpuFlags) return 68881L;
  690.  
  691.   return NULL;
  692. }
  693.  
  694. VOID CloseDisplay (struct ILBMInfo *Ilbm,CPTR *VInfo)
  695. {
  696.   if (WMASK & MASK)
  697.   {
  698.      ClearMenuStrip (Ilbm->win);
  699.  
  700.      PutPointer (Ilbm->win,0,0,0,0,0,0);
  701.  
  702.      CloseWindow (Ilbm->win);
  703.  
  704.      Ilbm->win = NULL;
  705.  
  706.      Ilbm->wrp = NULL;
  707.  
  708.      MASK ^= WMASK;
  709.   }
  710.  
  711.   if (VMASK & MASK)
  712.   {
  713.      FreeVisualInfo (VInfo);
  714.  
  715.      MASK ^= VMASK;
  716.   }
  717.  
  718.   if (SMASK & MASK)
  719.   {
  720.      CloseScreen (Ilbm->scr);
  721.  
  722.      Ilbm->scr = NULL;
  723.  
  724.      Ilbm->vp  = NULL;
  725.  
  726.      Ilbm->srp = NULL;
  727.  
  728.      MASK ^= SMASK;
  729.   }
  730.  
  731.   if (FMASK & MASK)
  732.   {
  733.      CloseFont (NEWFONT);
  734.  
  735.      MASK ^= FMASK;
  736.   }
  737. }
  738.  
  739. struct Window *OpenDisplay (struct ILBMInfo *Ilbm,WORD Width,WORD Height,WORD Depth,ULONG ModeID)
  740. {
  741. struct Screen *Scr;
  742.  
  743. struct Window *Win = NULL;
  744.  
  745.   if (Scr = OpenIdScreen (Ilbm,Width,Height,Depth,ModeID))
  746.   {
  747.      Win = OpenWindowTags (NULL,
  748.                            WA_Left,Scr->LeftEdge,
  749.                            WA_Top,Scr->TopEdge,
  750.                            WA_Width,Scr->Width,
  751.                            WA_Height,Scr->Height,
  752.                            WA_ScreenTitle,VERSION,
  753.                            WA_CustomScreen,Scr,
  754.                            WA_MouseQueue,1L,
  755.                            WA_IDCMP,IDCMP_STANDARD,
  756.                            WA_Flags,WFLG_STANDARD,
  757.                            TAG_END);
  758.  
  759.      if (! Win)
  760.      {
  761.         if (Scr) CloseScreen (Scr);
  762.  
  763.         return NULL;
  764.      }
  765.  
  766.      Ilbm->scr = Scr;
  767.  
  768.      Ilbm->win = Win;
  769.  
  770.      Ilbm->vp  = &(Scr->ViewPort);
  771.  
  772.      Ilbm->srp = &(Scr->RastPort);
  773.  
  774.      Ilbm->wrp = Win->RPort;
  775.  
  776.      Ilbm->Bmhd.w = Ilbm->win->Width;
  777.  
  778.      Ilbm->Bmhd.h = Ilbm->win->Height;
  779.  
  780.      Ilbm->Bmhd.nPlanes = Ilbm->wrp->BitMap->Depth;
  781.   }
  782.  
  783.   return (Win);
  784. }
  785.  
  786. struct Screen *OpenIdScreen (struct ILBMInfo *Ilbm,WORD Width,WORD Height,WORD Depth,ULONG ModeID)
  787. {
  788. struct Rectangle Spos,DClip,TxtO,StdO,MaxO,UClip;
  789.  
  790. struct Rectangle *UClipp;
  791.  
  792. struct Screen *Scr;
  793.  
  794. LONG ErrorCode = NULL,TryNew;
  795.  
  796. ULONG BitMapTag,PassedTags;
  797.  
  798.   if (! Ilbm) return (NULL);
  799.  
  800.   TryNew = ((QueryOverscan (ModeID,&TxtO,OSCAN_TEXT)) && (QueryOverscan (ModeID,&StdO,OSCAN_STANDARD)) && (QueryOverscan (ModeID,&MaxO,OSCAN_MAX)));
  801.  
  802.   if (TryNew)
  803.   {
  804.      if (Ilbm->Video) Ilbm->ucliptype = OSCAN_VIDEO;
  805.  
  806.      if ((Ilbm->ucliptype) && (QueryOverscan (ModeID,&UClip,Ilbm->ucliptype))) UClipp = &UClip;
  807.  
  808.      else UClipp = NULL;
  809.  
  810.      ClipIt (Width,Height,&Spos,&DClip,&TxtO,&StdO,&MaxO,UClipp,Ilbm->IFFPFlags & IFFPF_NOCENTER ? TRUE : FALSE);
  811.  
  812.      BitMapTag = ((Ilbm->brbitmap) && (Ilbm->stype & CUSTOMBITMAP)) ? SA_BitMap : TAG_IGNORE;
  813.  
  814.      PassedTags = Ilbm->stags ? TAG_MORE : TAG_IGNORE;
  815.  
  816.      Scr = OpenScreenTags (NULL,
  817.                            SA_DisplayID,   ModeID,
  818.                            SA_Type,        Ilbm->stype,
  819.                            SA_Top,         Spos.MinY,
  820.                            SA_Left,        Spos.MinX,
  821.                            SA_Width,       Width,
  822.                            SA_Height,      Height,
  823.                            SA_Depth,       Depth,
  824.                            SA_DClip,       &DClip,
  825.                            SA_AutoScroll,  Ilbm->Autoscroll,
  826.                            SA_Colors32,    PALETTE,
  827.                            SA_Pens,        PENS,
  828.                            SA_Interleaved, TRUE,
  829.                            SA_Font,        &MYFONTSTRUCT,
  830.                            SA_Title,       VERSION,
  831.                            SA_ErrorCode,   &ErrorCode,
  832.                            SA_ShowTitle,   Ilbm->TBState,
  833.                            BitMapTag,      Ilbm->brbitmap,
  834.                            PassedTags,     Ilbm->stags,
  835.                            TAG_END);
  836.  
  837.      if (! Scr)
  838.      {
  839.         switch (ErrorCode)
  840.         {
  841.                  case OSERR_NOMONITOR   : Fail (NoMonitor,20L);
  842.  
  843.                                           break;
  844.  
  845.                  case OSERR_NOCHIPS     : Fail (NoChips,20L);
  846.  
  847.                                           break;
  848.  
  849.                  case OSERR_NOMEM       : Fail (NoMem,20L);
  850.  
  851.                                           break;
  852.  
  853.                  case OSERR_NOCHIPMEM   : Fail (NoChipMem,20L);
  854.  
  855.                                           break;
  856.  
  857.                  case OSERR_PUBNOTUNIQUE: Fail (PubNotUnique,20L);
  858.  
  859.                                           break;
  860.  
  861.                  case OSERR_UNKNOWNMODE : Fail (UnknownMode,20L);
  862.  
  863.                                           break;
  864.  
  865.                  case OSERR_TOODEEP     : Fail (ScreenTooDeep,20L);
  866.  
  867.                                           break;
  868.  
  869.                  case OSERR_ATTACHFAIL  : Fail (AttachScreen,20L);
  870.  
  871.                                           break;
  872.  
  873.                  case OSERR_NOTAVAILABLE: Fail (ModeNotAvailableError,20L);
  874.  
  875.                                           break;
  876.  
  877.                  default                : Fail (UnknownScrError,20L);
  878.  
  879.                                           break;
  880.         }
  881.  
  882.         return NULL;
  883.      }
  884.   }
  885.  
  886.   else return NULL;
  887.  
  888.   if (Ilbm->Notransb)
  889.   {
  890.      VideoControlTags (Scr->ViewPort.ColorMap,VTAG_BORDERNOTRANS_SET,TRUE,TAG_END);
  891.  
  892.      MakeScreen (Scr);
  893.  
  894.      RethinkDisplay ();
  895.   }
  896.  
  897.   return (Scr);
  898. }
  899.  
  900. ULONG ModeFallBack (ULONG OldModeID,WORD Width,WORD Height,WORD Depth)
  901. {
  902. ULONG NewModeID = LORES_KEY,BestModeID;
  903.  
  904. struct TagItem Tags [6];
  905.  
  906.   Tags [0].ti_Tag   = BIDTAG_DIPFMustHave;
  907.  
  908.   Tags [0].ti_Data  = (OldModeID & HAM ? DIPF_IS_HAM : 0);
  909.  
  910.   Tags [0].ti_Data |= (OldModeID & EXTRA_HALFBRITE ? DIPF_IS_EXTRAHALFBRITE : 0);
  911.  
  912.   Tags [1].ti_Tag   = BIDTAG_NominalWidth;
  913.  
  914.   Tags [1].ti_Data  = Width; // bmhd->XAspect; // wide;
  915.  
  916.   Tags [2].ti_Tag   = BIDTAG_NominalHeight;
  917.  
  918.   Tags [2].ti_Data  = Height; // bmhd->YAspectHeight; // high;
  919.  
  920.   Tags [3].ti_Tag   = BIDTAG_Depth;
  921.  
  922.   Tags [3].ti_Data  = Depth;
  923.  
  924.   Tags [4].ti_Tag   = BIDTAG_SourceID;
  925.  
  926.   Tags [4].ti_Data  = (FindDisplayInfo (OldModeID) ? OldModeID : (OldModeID & (~(MONITOR_ID_MASK|SPRITES|GENLOCK_AUDIO|GENLOCK_VIDEO|VP_HIDE))));
  927.  
  928.   Tags [5].ti_Tag   = TAG_END;
  929.  
  930.   BestModeID = BestModeIDA (Tags);
  931.  
  932.   if (BestModeID != INVALID_ID) NewModeID = BestModeID;
  933.  
  934.   return (NewModeID);
  935. }
  936.  
  937. VOID ClipIt (WORD wide,WORD high,struct Rectangle *spos,struct Rectangle *dclip,struct Rectangle *txto, struct Rectangle *stdo,struct Rectangle *maxo, struct Rectangle *uclip,BOOL NoCenter)
  938. {
  939. struct Rectangle *besto;
  940.  
  941. WORD minx, maxx, miny, maxy;
  942.  
  943. WORD txtw, txth, stdw, stdh, bestw, besth;
  944.  
  945.     /* get the txt, std and max widths and heights */
  946.  
  947.     txtw = txto->MaxX - txto->MinX + 1;
  948.  
  949.     txth = txto->MaxY - txto->MinY + 1;
  950.  
  951.     stdw = stdo->MaxX - stdo->MinX + 1;
  952.  
  953.     stdh = stdo->MaxY - stdo->MinY + 1;
  954.  
  955.     if ((wide <= txtw) && (high <= txth))
  956.     {
  957.     besto = txto;
  958.  
  959.     bestw = txtw;
  960.  
  961.     besth = txth;
  962.     }
  963.  
  964.     else
  965.     {
  966.     besto = stdo;
  967.  
  968.     bestw = stdw;
  969.  
  970.     besth = stdh;
  971.     }
  972.  
  973.     if (uclip)
  974.     {
  975.     *dclip = *uclip;
  976.  
  977.         spos->MinX = uclip->MinX;
  978.  
  979.     spos->MinY = uclip->MinY;
  980.     }
  981.  
  982.     else
  983.     {
  984.     /* CENTER the screen based on best oscan prefs
  985.      * but confine dclip within max oscan limits
  986.      *
  987.      * FIX MinX first */
  988.  
  989.     spos->MinX = minx = besto->MinX - ((wide - bestw) >> 1);
  990.  
  991.     maxx = wide + minx - 1;
  992.  
  993.     if (maxx > maxo->MaxX)  maxx = maxo->MaxX;    /* too right */
  994.  
  995.     if (minx < maxo->MinX)
  996.         {
  997.         minx = maxo->MinX;    /* too left  */
  998.  
  999.         /* if we want left edge of screen not clipped */
  1000.  
  1001.         if (NoCenter) spos->MinX = minx;
  1002.     }
  1003.  
  1004.     /* FIX MinY */
  1005.  
  1006.     spos->MinY = miny = besto->MinY - ((high - besth) >> 1);
  1007.  
  1008.     /* if lower than top of txto, move up */
  1009.  
  1010.     spos->MinY = miny = MIN (spos->MinY,txto->MinY);
  1011.  
  1012.     maxy = high + miny - 1;
  1013.  
  1014.     if (maxy > maxo->MaxY)  maxy = maxo->MaxY;    /* too down  */
  1015.  
  1016.     if (miny < maxo->MinY)
  1017.         {
  1018.        miny = maxo->MinY;    /* too up    */
  1019.  
  1020.        /* if we want top of screen not clipped */
  1021.  
  1022.        if (NoCenter) spos->MinY = miny;
  1023.         }
  1024.  
  1025.     /* SET up dclip */
  1026.  
  1027.     dclip->MinX = minx;
  1028.  
  1029.     dclip->MinY = miny;
  1030.  
  1031.     dclip->MaxX = maxx;
  1032.  
  1033.     dclip->MaxY = maxy;
  1034.     }
  1035. }
  1036.  
  1037. LONG MakeDisplay (struct ILBMInfo *Ilbm)
  1038. {
  1039.   if (Ilbm->IFFPFlags & IFFPF_USERMODE)    Ilbm->camg = Ilbm->usermodeid;
  1040.  
  1041.   Ilbm->Bmhd.w = MAX (MIN_WIDTH,Ilbm->Bmhd.w);
  1042.  
  1043.   Ilbm->Bmhd.h = MAX (MIN_HEIGHT,Ilbm->Bmhd.h);
  1044.  
  1045.   Ilbm->Bmhd.nPlanes = MIN (MAX_DEPTH,MAX (MIN_DEPTH,Ilbm->Bmhd.nPlanes));
  1046.  
  1047.   if (ModeNotAvailable (Ilbm->camg) || (Ilbm->IFFPFlags & IFFPF_BESTFIT))
  1048.   {
  1049.      Ilbm->camg = ModeFallBack (Ilbm->camg,Ilbm->Bmhd.w,Ilbm->Bmhd.h,Ilbm->Bmhd.nPlanes);
  1050.  
  1051.      if (ModeNotAvailable (Ilbm->camg))
  1052.      {
  1053.         Fail (ModeNotAvailableError,20L);
  1054.  
  1055.         return NULL;
  1056.      }
  1057.   }
  1058.  
  1059.   if (! (OpenDisplay (Ilbm,MAX (Ilbm->Bmhd.pageWidth,Ilbm->Bmhd.w),MAX (Ilbm->Bmhd.pageHeight,Ilbm->Bmhd.h),Ilbm->Bmhd.nPlanes,Ilbm->camg))) return NULL;
  1060.  
  1061.   MASK |= SMASK;
  1062.  
  1063.   MASK |= WMASK;
  1064.  
  1065.   if (! (VINFO = GetVisualInfo (Ilbm->scr,TAG_END)))
  1066.   {
  1067.      Fail (VisualInfoError,20L);
  1068.  
  1069.      return NULL;
  1070.   }
  1071.  
  1072.   MASK |= VMASK;
  1073.  
  1074.   if (! (LayoutMenus (MAINMENU,VINFO,GTMN_TextAttr,&MYFONTSTRUCT,GTMN_NewLookMenus,TRUE,TAG_END)))
  1075.   {
  1076.      Fail (FontError,20L);
  1077.  
  1078.      return NULL;
  1079.   }
  1080.  
  1081.   SetMenuStrip (Ilbm->win,MAINMENU);
  1082.  
  1083.   return (Ilbm->vp->ColorMap->Count);
  1084. }
  1085.  
  1086. VOID ShowTime (struct Window *Win,TEXT *String,ULONG Secs)
  1087. {
  1088.   sprintf (BAR_STRING,"%s %uh %um %us - Average speed: %.3lf Pix/sec",String,Secs / 3600L,(Secs / 60L) % 60L,Secs % 60L,(DOUBLE) ((Win->Width - Win->LeftEdge) * (Win->Height - Win->TopEdge)) / (DOUBLE) Secs);
  1089.  
  1090.   SetWindowTitles (Win,(TEXT *) ~0,BAR_STRING);
  1091. }
  1092.  
  1093. VOID SaveCoords (VOID)
  1094. {
  1095.   URMIN = RMIN;
  1096.  
  1097.   URMAX = RMAX;
  1098.  
  1099.   UIMIN = IMIN;
  1100.  
  1101.   UIMAX = IMAX;
  1102. }
  1103.  
  1104. VOID RestoreCoords (VOID)
  1105. {
  1106.   RMIN = URMIN;
  1107.  
  1108.   RMAX = URMAX;
  1109.  
  1110.   IMIN = UIMIN;
  1111.  
  1112.   IMAX = UIMAX;
  1113. }
  1114.  
  1115. BOOL NewCoords (struct Window *Win,const LONG a1,const LONG b1,const LONG a2,const LONG b2)
  1116. {
  1117. long double KReal,KImag;
  1118.  
  1119.   if (((a2 - a1) < 2L) || ((b2 - b1) < 2L)) return FALSE;
  1120.  
  1121.   KReal = fabs (RMAX-RMIN) / ((long double) Win->Width);
  1122.  
  1123.   KImag = fabs (IMAX-IMIN) / ((long double) Win->Height);
  1124.  
  1125.   SaveCoords ();
  1126.  
  1127.   RMAX = RMIN + ((long double) a2 * KReal);
  1128.  
  1129.   IMIN = IMAX - ((long double) b2 * KImag);
  1130.  
  1131.   RMIN += ((long double) a1 * KReal);
  1132.  
  1133.   IMAX -= ((long double) b1 * KImag);
  1134.  
  1135.   return TRUE;
  1136. }
  1137.  
  1138. VOID AdjustRatio (long double *RMin,long double *IMax,long double *RMax,long double *IMin,WORD ScrWidth,WORD ScrHeight,BOOL KeepReal)
  1139. {
  1140. long double RWidth,IHeight,RCenter,ICenter;
  1141.  
  1142.   IHeight = *IMax - *IMin;
  1143.  
  1144.   RWidth  = *RMax - *RMin;
  1145.  
  1146.   if (KeepReal)
  1147.   {
  1148.      ICenter = *IMin + (IHeight / 2.0);
  1149.  
  1150.      IHeight = (RWidth * ScrHeight) / ScrWidth;
  1151.  
  1152.      *IMax = ICenter + (IHeight / 2.0);
  1153.  
  1154.      *IMin = ICenter - (IHeight / 2.0);
  1155.   }
  1156.  
  1157.   else
  1158.   {
  1159.      RCenter = *RMin + (RWidth / 2.0);
  1160.  
  1161.      RWidth = (IHeight * ScrWidth) / ScrHeight;
  1162.  
  1163.      *RMax = RCenter + (RWidth / 2.0);
  1164.  
  1165.      *RMin = RCenter - (RWidth / 2.0);
  1166.   }
  1167. }
  1168.  
  1169. LONG About (struct Window *Win)
  1170. {
  1171. struct EasyStruct MyReq_1 = { sizeof (struct EasyStruct),0,"Informations requester","      " VERSION COPYRIGHT "\n\n           " AUTHOR "\n\n" ADDRESS EMAIL "\n\n\n    This program is GiftWare !     \n\n","Ok|More..." };
  1172.  
  1173. struct EasyStruct MyReq_2 = { sizeof (struct EasyStruct),0,"Workgroup","        Greetings & thanks to\n\n  Sergio Tassi: Palettes,GUILook\n\n  Giuseppe Staffelli: RTG Debug\n\n\n         Crime do not pay !\n\n\n       Call Double Impact BBS\n\n   +39-81-5881319/5889963 24/24h\n\nMultiline ISDN  by Paolo Carotenuto\n\n","Ok" };
  1174.  
  1175. LONG More;
  1176.  
  1177.   More = EasyRequest (Win,&MyReq_1,0);
  1178.  
  1179.   if (! More) EasyRequest (Win,&MyReq_2,0);
  1180.  
  1181.   return More;
  1182. }
  1183.  
  1184. LONG Choice (struct Window *Win,TEXT *Title,TEXT *String)
  1185. {
  1186. struct EasyStruct MyReq = { sizeof (struct EasyStruct),NULL,0,0,"Yes|No" };
  1187.  
  1188.   MyReq.es_Title = Title;
  1189.  
  1190.   MyReq.es_TextFormat = String;
  1191.  
  1192.   return EasyRequest (Win,&MyReq,0);
  1193. }
  1194.  
  1195. BOOL ShowCoords (struct Window *Win)
  1196. {
  1197. struct Gadget *GadList = NULL,*StringGad_1,*StringGad_2,*StringGad_3,*StringGad_4;
  1198.  
  1199. struct Gadget *MyButtonGad,*MyCheckBoxGad,*MyGad = NULL;
  1200.  
  1201. struct Window *GadWin;
  1202.  
  1203. struct IntuiMessage *Message;
  1204.  
  1205. BOOL NewLimits = FALSE,Exit = FALSE,Accept = FALSE,Reset = FALSE,Ratio = FALSE,KeepReal = TRUE;
  1206.  
  1207. TEXT String [MAXCHARS];
  1208.  
  1209. UWORD MyCode = 0;
  1210.  
  1211. ULONG MyClass = NULL;
  1212.  
  1213. long double Tmp_RMIN = RMIN,Tmp_IMAX = IMAX,Tmp_RMAX = RMAX,Tmp_IMIN = IMIN;
  1214.  
  1215.   TEXTGAD.ng_VisualInfo = BUTTONGAD.ng_VisualInfo = CHECKBOXGAD.ng_VisualInfo  = VINFO;
  1216.  
  1217.   MyCheckBoxGad = CreateContext (&GadList);
  1218.  
  1219.   CHECKBOXGAD.ng_LeftEdge   = 14;
  1220.  
  1221.   CHECKBOXGAD.ng_TopEdge    = 120;
  1222.  
  1223.   CHECKBOXGAD.ng_Width      = 20;
  1224.  
  1225.   CHECKBOXGAD.ng_Height     = 20;
  1226.  
  1227.   CHECKBOXGAD.ng_GadgetText = "_Keep real limits";
  1228.  
  1229.   CHECKBOXGAD.ng_Flags      = PLACETEXT_RIGHT;
  1230.  
  1231.   CHECKBOXGAD.ng_GadgetID   = KEEP;
  1232.  
  1233.   MyCheckBoxGad = CreateGadget (CHECKBOX_KIND,MyCheckBoxGad,&CHECKBOXGAD,GTCB_Checked,TRUE,GT_Underscore,'_',TAG_END);
  1234.  
  1235.   BUTTONGAD.ng_LeftEdge   = 14;
  1236.  
  1237.   BUTTONGAD.ng_TopEdge    = 140;
  1238.  
  1239.   BUTTONGAD.ng_Width      = 80;
  1240.  
  1241.   BUTTONGAD.ng_Height     = 20;
  1242.  
  1243.   BUTTONGAD.ng_GadgetText = "_Accept";
  1244.  
  1245.   BUTTONGAD.ng_GadgetID   = ACCEPT;
  1246.  
  1247.   MyButtonGad = CreateGadget (BUTTON_KIND,MyCheckBoxGad,&BUTTONGAD,GT_Underscore,'_',TAG_END);
  1248.  
  1249.   BUTTONGAD.ng_LeftEdge  += (14 + BUTTONGAD.ng_Width);
  1250.  
  1251.   BUTTONGAD.ng_GadgetText = "Rat_io";
  1252.  
  1253.   BUTTONGAD.ng_GadgetID   = RATIO;
  1254.  
  1255.   MyButtonGad = CreateGadget (BUTTON_KIND,MyButtonGad,&BUTTONGAD,GT_Underscore,'_',TAG_END);
  1256.  
  1257.   BUTTONGAD.ng_LeftEdge  += (14 + BUTTONGAD.ng_Width);
  1258.  
  1259.   BUTTONGAD.ng_GadgetText = "Re_set";
  1260.  
  1261.   BUTTONGAD.ng_GadgetID   = RESET;
  1262.  
  1263.   MyButtonGad = CreateGadget (BUTTON_KIND,MyButtonGad,&BUTTONGAD,GT_Underscore,'_',TAG_END);
  1264.  
  1265.   BUTTONGAD.ng_LeftEdge  += (14 + BUTTONGAD.ng_Width);
  1266.  
  1267.   BUTTONGAD.ng_GadgetText = "_Cancel";
  1268.  
  1269.   BUTTONGAD.ng_GadgetID   = CANCEL;
  1270.  
  1271.   MyButtonGad = CreateGadget (BUTTON_KIND,MyButtonGad,&BUTTONGAD,GT_Underscore,'_',TAG_END);
  1272.  
  1273.   BUTTONGAD.ng_LeftEdge  += (14 + BUTTONGAD.ng_Width);
  1274.  
  1275.   TEXTGAD.ng_LeftEdge     = 54;
  1276.  
  1277.   TEXTGAD.ng_TopEdge      = 14;
  1278.  
  1279.   TEXTGAD.ng_Width        = 268;
  1280.  
  1281.   TEXTGAD.ng_Height       = 14;
  1282.  
  1283.   TEXTGAD.ng_GadgetText   = "_Left";
  1284.  
  1285.   TEXTGAD.ng_Flags        = PLACETEXT_LEFT;
  1286.  
  1287.   sprintf (String,"%+2.80lf",RMIN);
  1288.  
  1289.   StringGad_1 = CreateGadget (STRING_KIND,MyButtonGad,&TEXTGAD,GTST_String,String,STRINGA_ReplaceMode,TRUE,GTST_MaxChars,MAXCHARS,GT_Underscore,'_',TAG_END);
  1290.  
  1291.   TEXTGAD.ng_TopEdge     += (14 + TEXTGAD.ng_Height);
  1292.  
  1293.   TEXTGAD.ng_GadgetText   = "_Top ";
  1294.  
  1295.   sprintf (String,"%+2.80lf",IMAX);
  1296.  
  1297.   StringGad_2 = CreateGadget (STRING_KIND,StringGad_1,&TEXTGAD,GTST_String,String,STRINGA_ReplaceMode,TRUE,GTST_MaxChars,MAXCHARS,GT_Underscore,'_',TAG_END);
  1298.  
  1299.   TEXTGAD.ng_TopEdge     += (14 + TEXTGAD.ng_Height);
  1300.  
  1301.   TEXTGAD.ng_GadgetText   = "_Right";
  1302.  
  1303.   TEXTGAD.ng_Flags        = PLACETEXT_RIGHT;
  1304.  
  1305.   sprintf (String,"%+2.80lf",RMAX);
  1306.  
  1307.   StringGad_3 = CreateGadget (STRING_KIND,StringGad_2,&TEXTGAD,GTST_String,String,STRINGA_ReplaceMode,TRUE,GTST_MaxChars,MAXCHARS,GT_Underscore,'_',TAG_END);
  1308.  
  1309.   TEXTGAD.ng_TopEdge     += (14 + TEXTGAD.ng_Height);
  1310.  
  1311.   TEXTGAD.ng_GadgetText   = "_Bottom";
  1312.  
  1313.   sprintf (String,"%+2.80lf",IMIN);
  1314.  
  1315.   StringGad_4 = CreateGadget (STRING_KIND,StringGad_3,&TEXTGAD,GTST_String,String,STRINGA_ReplaceMode,TRUE,GTST_MaxChars,MAXCHARS,GT_Underscore,'_',TAG_END);
  1316.  
  1317.   if (StringGad_4)
  1318.   {
  1319.      GadWin = OpenWindowTags (NULL,WA_Left,Win->LeftEdge + 10,
  1320.                                    WA_Top,Win->TopEdge + 15,
  1321.                                    WA_Width,BUTTONGAD.ng_LeftEdge + 10,
  1322.                                    WA_Height,BUTTONGAD.ng_TopEdge + BUTTONGAD.ng_Height + 14 + 15,
  1323.                                    WA_Title,"Coordinates requester",
  1324.                                    WA_ScreenTitle,"Insert new range...",
  1325.                                    WA_CustomScreen,Win->WScreen,
  1326.                                    WA_IDCMP,IDCMP_CLOSEWINDOW|IDCMP_REFRESHWINDOW|IDCMP_VANILLAKEY|STRINGIDCMP|BUTTONIDCMP,
  1327.                                    WA_Flags,WFLG_ACTIVATE|WFLG_DRAGBAR|WFLG_SIMPLE_REFRESH|WFLG_GIMMEZEROZERO|WFLG_RMBTRAP,
  1328.                                    WA_Gadgets,GadList,
  1329.                                    TAG_END);
  1330.      if (GadWin)
  1331.      {
  1332.         GT_RefreshWindow (GadWin,NULL);
  1333.  
  1334.         do {  WaitPort (GadWin->UserPort);
  1335.  
  1336.               if (Message = (struct IntuiMessage *) GT_GetIMsg (GadWin->UserPort))
  1337.               {
  1338.                      MyGad = (struct Gadget *) Message->IAddress;
  1339.  
  1340.                      MyClass = Message->Class;
  1341.  
  1342.                      MyCode = Message->Code;
  1343.  
  1344.                      GT_ReplyIMsg ((struct IntuiMessage *) Message);
  1345.               }
  1346.  
  1347.               switch (MyClass)
  1348.               {
  1349.                      case IDCMP_REFRESHWINDOW : GT_BeginRefresh (GadWin);
  1350.  
  1351.                                                 GT_EndRefresh (GadWin,TRUE);
  1352.  
  1353.                                                 break;
  1354.  
  1355.                      case IDCMP_VANILLAKEY    : switch (ToUpper (MyCode))
  1356.                                                 {
  1357.                                                        case 'L' : ActivateGadget (StringGad_1,GadWin,0);
  1358.  
  1359.                                                                   break;
  1360.  
  1361.                                                        case 'T' : ActivateGadget (StringGad_2,GadWin,0);
  1362.  
  1363.                                                                   break;
  1364.  
  1365.                                                        case 'R' : ActivateGadget (StringGad_3,GadWin,0);
  1366.  
  1367.                                                                   break;
  1368.  
  1369.                                                        case 'B' : ActivateGadget (StringGad_4,GadWin,0);
  1370.  
  1371.                                                                   break;
  1372.  
  1373.                                                        case 'A' : Accept = TRUE;
  1374.  
  1375.                                                                   break;
  1376.  
  1377.                                                        case 'I' : Ratio = TRUE;
  1378.  
  1379.                                                                   break;
  1380.  
  1381.                                                        case 'S' : Reset = TRUE;
  1382.  
  1383.                                                                   break;
  1384.  
  1385.                                                        case 'C' : Exit = TRUE;
  1386.  
  1387.                                                                   break;
  1388.  
  1389.                                                        case 'K' : KeepReal = ! KeepReal;
  1390.  
  1391.                                                                   GT_SetGadgetAttrs (MyCheckBoxGad,GadWin,NULL,GTCB_Checked,KeepReal,TAG_END);
  1392.  
  1393.                                                                   break;
  1394.  
  1395.                                                     case VAN_ESC: Exit = TRUE;
  1396.                                                 }
  1397.  
  1398.                                                         break;
  1399.  
  1400.                      case IDCMP_GADGETUP      : switch (MyGad->GadgetID)
  1401.                                                 {
  1402.                                                        case ACCEPT:   Accept = TRUE;
  1403.  
  1404.                                                                       break;
  1405.  
  1406.                                                        case  RATIO:   Ratio = TRUE;
  1407.  
  1408.                                                                       break;
  1409.  
  1410.                                                        case  RESET:   Reset = TRUE;
  1411.  
  1412.                                                                       break;
  1413.  
  1414.                                                        case   KEEP:   KeepReal = ! KeepReal;
  1415.  
  1416.                                                                       break;
  1417.  
  1418.                                                        case CANCEL:   Exit = TRUE;
  1419.                                                 }
  1420.  
  1421.                                                 break;
  1422.  
  1423.                      case IDCMP_CLOSEWINDOW   : Exit = TRUE;
  1424.               }
  1425.  
  1426.               if (Accept)
  1427.               {
  1428.                  sscanf (((struct StringInfo *) StringGad_1->SpecialInfo)->Buffer,"%lf",&Tmp_RMIN);
  1429.  
  1430.                  sscanf (((struct StringInfo *) StringGad_2->SpecialInfo)->Buffer,"%lf",&Tmp_IMAX);
  1431.  
  1432.                  sscanf (((struct StringInfo *) StringGad_3->SpecialInfo)->Buffer,"%lf",&Tmp_RMAX);
  1433.  
  1434.                  sscanf (((struct StringInfo *) StringGad_4->SpecialInfo)->Buffer,"%lf",&Tmp_IMIN);
  1435.  
  1436.                  if ((Tmp_RMIN >= Tmp_RMAX) || (Tmp_IMIN >= Tmp_IMAX)) DisplayBeep (Win->WScreen);
  1437.  
  1438.                  else
  1439.                  {
  1440.                     NewLimits = Exit = TRUE;
  1441.  
  1442.                     SaveCoords ();
  1443.  
  1444.                     RMIN  = Tmp_RMIN;
  1445.  
  1446.                     IMAX  = Tmp_IMAX;
  1447.  
  1448.                     RMAX  = Tmp_RMAX;
  1449.  
  1450.                     IMIN  = Tmp_IMIN;
  1451.                  }
  1452.  
  1453.                  Accept = FALSE;
  1454.               }
  1455.  
  1456.               if (Ratio)
  1457.               {
  1458.                  AdjustRatio (&Tmp_RMIN,&Tmp_IMAX,&Tmp_RMAX,&Tmp_IMIN,Win->Width,Win->Height,KeepReal);
  1459.  
  1460.                  TEXTGAD.ng_Flags = PLACETEXT_LEFT;
  1461.  
  1462.                  sprintf (String,"%+2.80lf",Tmp_RMIN);
  1463.  
  1464.                  GT_SetGadgetAttrs (StringGad_1,GadWin,NULL,GTST_String,String,TAG_END);
  1465.  
  1466.                  sprintf (String,"%+2.80lf",Tmp_IMAX);
  1467.  
  1468.                  GT_SetGadgetAttrs (StringGad_2,GadWin,NULL,GTST_String,String,TAG_END);
  1469.  
  1470.                  sprintf (String,"%+2.80lf",Tmp_RMAX);
  1471.  
  1472.                  TEXTGAD.ng_Flags = PLACETEXT_RIGHT;
  1473.  
  1474.                  GT_SetGadgetAttrs (StringGad_3,GadWin,NULL,GTST_String,String,TAG_END);
  1475.  
  1476.                  sprintf (String,"%+2.80lf",Tmp_IMIN);
  1477.  
  1478.                  GT_SetGadgetAttrs (StringGad_4,GadWin,NULL,GTST_String,String,TAG_END);
  1479.  
  1480.                  Ratio = FALSE;
  1481.               }
  1482.  
  1483.               if (Reset)
  1484.               {
  1485.                  TEXTGAD.ng_Flags = PLACETEXT_LEFT;
  1486.  
  1487.                  sprintf (String,"%+2.80lf",DEF_RMIN);
  1488.  
  1489.                  GT_SetGadgetAttrs (StringGad_1,GadWin,NULL,GTST_String,String,TAG_END);
  1490.  
  1491.                  sprintf (String,"%+2.80lf",DEF_IMAX);
  1492.  
  1493.                  GT_SetGadgetAttrs (StringGad_2,GadWin,NULL,GTST_String,String,TAG_END);
  1494.  
  1495.                  TEXTGAD.ng_Flags = PLACETEXT_RIGHT;
  1496.  
  1497.                  sprintf (String,"%+2.80lf",DEF_RMAX);
  1498.  
  1499.                  GT_SetGadgetAttrs (StringGad_3,GadWin,NULL,GTST_String,String,TAG_END);
  1500.  
  1501.                  sprintf (String,"%+2.80lf",DEF_IMIN);
  1502.  
  1503.                  GT_SetGadgetAttrs (StringGad_4,GadWin,NULL,GTST_String,String,TAG_END);
  1504.  
  1505.                  Reset = FALSE;
  1506.               }
  1507.  
  1508.            } while (Exit == FALSE);
  1509.  
  1510.        CloseWindow (GadWin);
  1511.      }
  1512.  
  1513.      else Fail (WindowGadgetError,15L);
  1514.   }
  1515.  
  1516.   else Fail (GadgetError,15L);
  1517.  
  1518.   FreeGadgets (GadList);
  1519.  
  1520.   return NewLimits;
  1521. }
  1522.  
  1523. ULONG IntegerGad (struct Window *Win,TEXT *TitleWin,TEXT *TitleScr,TEXT *TxtString,ULONG Var)
  1524. {
  1525. struct IntuiMessage *Message;
  1526.  
  1527. struct Gadget *GadList = NULL , *MyIntGad , *MyButtonGad , *MyGad = NULL;
  1528.  
  1529. struct Window *GadWin;
  1530.  
  1531. BOOL Exit = FALSE;
  1532.  
  1533. UWORD MyCode = 0;
  1534.  
  1535. ULONG MyClass = NULL;
  1536.  
  1537.   TEXTGAD.ng_VisualInfo = BUTTONGAD.ng_VisualInfo = VINFO;
  1538.  
  1539.   MyButtonGad = CreateContext (&GadList);
  1540.  
  1541.   BUTTONGAD.ng_LeftEdge   = 20;
  1542.  
  1543.   BUTTONGAD.ng_TopEdge    = 40;
  1544.  
  1545.   BUTTONGAD.ng_Width      = 80;
  1546.  
  1547.   BUTTONGAD.ng_Height     = 20;
  1548.  
  1549.   BUTTONGAD.ng_GadgetText = "_Accept";
  1550.  
  1551.   BUTTONGAD.ng_GadgetID   = ACCEPT;
  1552.  
  1553.   MyButtonGad = CreateGadget (BUTTON_KIND,MyButtonGad,&BUTTONGAD,GT_Underscore,'_',TAG_END);
  1554.  
  1555.   BUTTONGAD.ng_LeftEdge  += (20 + BUTTONGAD.ng_Width);
  1556.  
  1557.   BUTTONGAD.ng_GadgetText = "_Cancel";
  1558.  
  1559.   BUTTONGAD.ng_GadgetID   = CANCEL;
  1560.  
  1561.   MyButtonGad = CreateGadget (BUTTON_KIND,MyButtonGad,&BUTTONGAD,GT_Underscore,'_',TAG_END);
  1562.  
  1563.   TEXTGAD.ng_LeftEdge     = 120;
  1564.  
  1565.   TEXTGAD.ng_TopEdge      = 10;
  1566.  
  1567.   TEXTGAD.ng_Width        = 60;
  1568.  
  1569.   TEXTGAD.ng_Height       = 14;
  1570.  
  1571.   TEXTGAD.ng_GadgetText   = TxtString;
  1572.  
  1573.   TEXTGAD.ng_Flags        = PLACETEXT_LEFT;
  1574.  
  1575.   MyIntGad = CreateGadget (INTEGER_KIND,MyButtonGad,&TEXTGAD,GTIN_Number,Var,GTIN_MaxChars,6,STRINGA_ReplaceMode,TRUE,GT_Underscore,'_',TAG_END);
  1576.  
  1577.   if (MyIntGad)
  1578.   {
  1579.      GadWin = OpenWindowTags (NULL,WA_Left,Win->LeftEdge + 10,
  1580.                                    WA_Top,Win->TopEdge + 15,
  1581.                                    WA_Width,220,
  1582.                                    WA_Height,80,
  1583.                                    WA_Title,TitleWin,
  1584.                                    WA_ScreenTitle,TitleScr,
  1585.                                    WA_CustomScreen,Win->WScreen,
  1586.                                    WA_IDCMP,IDCMP_CLOSEWINDOW|IDCMP_REFRESHWINDOW|IDCMP_VANILLAKEY|INTEGERIDCMP|BUTTONIDCMP,
  1587.                                    WA_Flags,WFLG_ACTIVATE|WFLG_DRAGBAR|WFLG_SIMPLE_REFRESH|WFLG_GIMMEZEROZERO|WFLG_RMBTRAP,
  1588.                                    WA_Gadgets,GadList,
  1589.                                    TAG_END);
  1590.  
  1591.      if (GadWin)
  1592.      {
  1593.         GT_RefreshWindow (GadWin,NULL);
  1594.  
  1595.         do {  WaitPort (GadWin->UserPort);
  1596.  
  1597.               if (Message = (struct IntuiMessage *) GT_GetIMsg (GadWin->UserPort))
  1598.               {
  1599.                      MyGad = (struct Gadget *) Message->IAddress;
  1600.  
  1601.                      MyClass = Message->Class;
  1602.  
  1603.                      MyCode = Message->Code;
  1604.  
  1605.                      GT_ReplyIMsg ((struct IntuiMessage *) Message);
  1606.               }
  1607.  
  1608.               switch (MyClass)
  1609.               {
  1610.                      case IDCMP_REFRESHWINDOW : GT_BeginRefresh (GadWin);
  1611.  
  1612.                                                 GT_EndRefresh (GadWin,TRUE);
  1613.  
  1614.                                                 break;
  1615.  
  1616.                      case IDCMP_VANILLAKEY    : switch (ToUpper (MyCode))
  1617.                                                 {
  1618.                                                        case 'D' :
  1619.  
  1620.                                                        case 'I' : ActivateGadget (MyIntGad,GadWin,0);
  1621.  
  1622.                                                                   break;
  1623.  
  1624.                                                        case 'A' : Var = ((struct StringInfo *) MyIntGad->SpecialInfo)->LongInt;
  1625.  
  1626.                                                                   Exit = TRUE;
  1627.  
  1628.                                                                   break;
  1629.  
  1630.                                                        case 'C' : Exit = TRUE;
  1631.  
  1632.                                                                   break;
  1633.  
  1634.                                                     case VAN_ESC: Exit = TRUE;
  1635.                                                 }
  1636.  
  1637.                                                 break;
  1638.  
  1639.                      case IDCMP_GADGETUP      : switch (MyGad->GadgetID)
  1640.                                                 {
  1641.                                                         case ACCEPT  : Var = ((struct StringInfo *) MyIntGad->SpecialInfo)->LongInt;
  1642.  
  1643.                                                                        Exit = TRUE;
  1644.  
  1645.                                                                        break;
  1646.  
  1647.                                                         case CANCEL  : Exit = TRUE;
  1648.                                                 }
  1649.  
  1650.                                                 break;
  1651.  
  1652.                      case IDCMP_CLOSEWINDOW   : Exit = TRUE;
  1653.               }
  1654.  
  1655.            } while (Exit == FALSE);
  1656.  
  1657.         CloseWindow (GadWin);
  1658.      }
  1659.  
  1660.      else Fail (WindowError,15L);
  1661.   }
  1662.  
  1663.   else Fail (GadgetError,15L);
  1664.  
  1665.   FreeGadgets (GadList);
  1666.  
  1667.   return Var;
  1668. }
  1669.  
  1670. #ifdef __USE_FPU
  1671.  
  1672. WORD Real (WORD Iterazioni,long double Cre,long double Cim)
  1673. {
  1674.   return MandFPU (Iterazioni,Cre,Cim);
  1675. }
  1676.  
  1677. #else
  1678.  
  1679. WORD Real (WORD Iterazioni,long double Cre,long double Cim)
  1680. {
  1681. register long double zr,zi,zr2,zi2;
  1682.  
  1683.   zr = Cre;
  1684.  
  1685.   zi = Cim;
  1686.  
  1687.   zr2 = Cre * Cre;
  1688.  
  1689.   zi2 = Cim * Cim;
  1690.  
  1691.   while ((zr2 + zi2 <= 4.0))
  1692.   {
  1693.      if (--Iterazioni == 0) break;
  1694.  
  1695.      zi *= zr;
  1696.  
  1697.      zr  = zr2 - zi2 + Cre;
  1698.  
  1699.      zi += zi + Cim;
  1700.  
  1701.      zr2 = zr * zr;
  1702.  
  1703.      zi2 = zi * zi;
  1704.   }
  1705.  
  1706.   return Iterazioni;
  1707. }
  1708.  
  1709. #endif
  1710.  
  1711. WORD Integer (WORD Iterazioni,long double Cre,long double Cim)
  1712. {
  1713.   return MandINT (Iterazioni,(LONG) (Cre * MAX_POT),(LONG) (Cim * MAX_POT));
  1714. }
  1715.  
  1716. VOID VLine_R_EHB (struct RastPort *Rp,const LONG b1,const LONG b2,const LONG x)
  1717. {
  1718. REGISTER LONG y;
  1719.  
  1720. ULONG Color;
  1721.  
  1722.  CRE = RMIN + (((long double)  x) * INCREMREAL);
  1723.  
  1724.  CIM = IMAX - (((long double) b2) * INCREMIMAG);
  1725.  
  1726.  for (y = b2; y >= b1; y--)
  1727.  {
  1728.      Color = FUNCTION (MAX_ITERATIONS,CRE,CIM);
  1729.  
  1730.      if (Color)
  1731.      {
  1732.         Color %= 56L;
  1733.  
  1734.         Color += 4L;
  1735.  
  1736.         if (Color > 31L) Color += 4L;
  1737.      }
  1738.  
  1739.      SetAPen (Rp,Color);
  1740.  
  1741.      WritePixel (Rp,x,y);
  1742.  
  1743.      CIM += INCREMIMAG;
  1744.  }
  1745. }
  1746.  
  1747. VOID HLine_R_EHB (struct RastPort *Rp,const LONG a1,const LONG a2,const LONG y)
  1748. {
  1749. REGISTER LONG x;
  1750.  
  1751. ULONG Color;
  1752.  
  1753.  CRE = RMIN + (((long double) a1) * INCREMREAL);
  1754.  
  1755.  CIM = IMAX - (((long double)  y) * INCREMIMAG);
  1756.  
  1757.  for (x = a1; x <= a2; x++)
  1758.  {
  1759.      Color = FUNCTION (MAX_ITERATIONS,CRE,CIM);
  1760.  
  1761.      if (Color)
  1762.      {
  1763.         Color %= 56L;
  1764.  
  1765.         Color += 4L;
  1766.  
  1767.         if (Color > 31L) Color += 4L;
  1768.      }
  1769.  
  1770.      SetAPen (Rp,Color);
  1771.  
  1772.      WritePixel (Rp,x,y);
  1773.  
  1774.      CRE += INCREMREAL;
  1775.  }
  1776. }
  1777.  
  1778. VOID VLine_R (struct RastPort *Rp,const LONG b1,const LONG b2,const LONG x)
  1779. {
  1780. REGISTER LONG y;
  1781.  
  1782. ULONG Color;
  1783.  
  1784.  CRE = RMIN + (((long double)  x) * INCREMREAL);
  1785.  
  1786.  CIM = IMAX - (((long double) b2) * INCREMIMAG);
  1787.  
  1788.  for (y = b2; y >= b1; y--)
  1789.  {
  1790.      Color = FUNCTION (MAX_ITERATIONS,CRE,CIM);
  1791.  
  1792.      if (Color)
  1793.      {
  1794.         Color %= COLOR_PENS;
  1795.  
  1796.         Color += 4L;
  1797.      }
  1798.  
  1799.      SetAPen (Rp,Color);
  1800.  
  1801.      WritePixel (Rp,x,y);
  1802.  
  1803.      CIM += INCREMIMAG;
  1804.  }
  1805. }
  1806.  
  1807. VOID HLine_R (struct RastPort *Rp,const LONG a1,const LONG a2,const LONG y)
  1808. {
  1809. REGISTER LONG x;
  1810.  
  1811. ULONG Color;
  1812.  
  1813.  CRE = RMIN + (((long double) a1) * INCREMREAL);
  1814.  
  1815.  CIM = IMAX - (((long double)  y) * INCREMIMAG);
  1816.  
  1817.  for (x = a1; x <= a2; x++)
  1818.  {
  1819.      Color = FUNCTION (MAX_ITERATIONS,CRE,CIM);
  1820.  
  1821.      if (Color)
  1822.      {
  1823.         Color %= COLOR_PENS;
  1824.  
  1825.         Color += 4L;
  1826.      }
  1827.  
  1828.      SetAPen (Rp,Color);
  1829.  
  1830.      WritePixel (Rp,x,y);
  1831.  
  1832.      CRE += INCREMREAL;
  1833.  }
  1834. }
  1835.  
  1836. VOID VLine_S_EHB (struct RastPort *Rp,const LONG b1,const LONG b2,const LONG x)
  1837. {
  1838. REGISTER LONG y;
  1839.  
  1840. ULONG Color;
  1841.  
  1842.  CRE = RMIN + (((long double)  x) * INCREMREAL);
  1843.  
  1844.  CIM = IMAX - (((long double) b2) * INCREMIMAG);
  1845.  
  1846.  for (y = b2; y >= b1; y--)
  1847.  {
  1848.      Color = FUNCTION (MAX_ITERATIONS,CRE,CIM);
  1849.  
  1850.      if (Color)
  1851.      {
  1852.         Color *= 56L;
  1853.  
  1854.         Color /= MAX_ITERATIONS_PLUS_ONE;
  1855.  
  1856.         Color += 4L;
  1857.  
  1858.         if (Color > 31L) Color += 4L;
  1859.      }
  1860.  
  1861.      SetAPen (Rp,Color);
  1862.  
  1863.      WritePixel (Rp,x,y);
  1864.  
  1865.      CIM += INCREMIMAG;
  1866.  }
  1867. }
  1868.  
  1869. VOID HLine_S_EHB (struct RastPort *Rp,const LONG a1,const LONG a2,const LONG y)
  1870. {
  1871. REGISTER LONG x;
  1872.  
  1873. ULONG Color;
  1874.  
  1875.  CRE = RMIN + (((long double) a1) * INCREMREAL);
  1876.  
  1877.  CIM = IMAX - (((long double)  y) * INCREMIMAG);
  1878.  
  1879.  for (x = a1; x <= a2; x++)
  1880.  {
  1881.      Color = FUNCTION (MAX_ITERATIONS,CRE,CIM);
  1882.  
  1883.      if (Color)
  1884.      {
  1885.         Color *= 56L;
  1886.  
  1887.         Color /= MAX_ITERATIONS_PLUS_ONE;
  1888.  
  1889.         Color += 4L;
  1890.  
  1891.         if (Color > 31L) Color += 4L;
  1892.      }
  1893.  
  1894.      SetAPen (Rp,Color);
  1895.  
  1896.      WritePixel (Rp,x,y);
  1897.  
  1898.      CRE += INCREMREAL;
  1899.  }
  1900. }
  1901.  
  1902. VOID VLine_S (struct RastPort *Rp,const LONG b1,const LONG b2,const LONG x)
  1903. {
  1904. REGISTER LONG y;
  1905.  
  1906. ULONG Color;
  1907.  
  1908.  CRE = RMIN + (((long double)  x) * INCREMREAL);
  1909.  
  1910.  CIM = IMAX - (((long double) b2) * INCREMIMAG);
  1911.  
  1912.  for (y = b2; y >= b1; y--)
  1913.  {
  1914.      Color = FUNCTION (MAX_ITERATIONS,CRE,CIM);
  1915.  
  1916.      if (Color)
  1917.      {
  1918.         Color *= COLOR_PENS;
  1919.  
  1920.         Color /= MAX_ITERATIONS_PLUS_ONE;
  1921.  
  1922.         Color += 4L;
  1923.      }
  1924.  
  1925.      SetAPen (Rp,Color);
  1926.  
  1927.      WritePixel (Rp,x,y);
  1928.  
  1929.      CIM += INCREMIMAG;
  1930.  }
  1931. }
  1932.  
  1933. VOID HLine_S (struct RastPort *Rp,const LONG a1,const LONG a2,const LONG y)
  1934. {
  1935. REGISTER LONG x;
  1936.  
  1937. ULONG Color;
  1938.  
  1939.  CRE = RMIN + (((long double) a1) * INCREMREAL);
  1940.  
  1941.  CIM = IMAX - (((long double)  y) * INCREMIMAG);
  1942.  
  1943.  for (x = a1; x <= a2; x++)
  1944.  {
  1945.      Color = FUNCTION (MAX_ITERATIONS,CRE,CIM);
  1946.  
  1947.      if (Color)
  1948.      {
  1949.         Color *= COLOR_PENS;
  1950.  
  1951.         Color /= MAX_ITERATIONS_PLUS_ONE;
  1952.  
  1953.         Color += 4L;
  1954.      }
  1955.  
  1956.      SetAPen (Rp,Color);
  1957.  
  1958.      WritePixel (Rp,x,y);
  1959.  
  1960.      CRE += INCREMREAL;
  1961.  }
  1962. }
  1963.  
  1964. BOOL CheckBox (struct RastPort *Rp,const LONG a1,const LONG b1,const LONG a2,const LONG b2)
  1965. {
  1966. const LONG Color = ReadPixel (Rp,a1,b1);
  1967.  
  1968. REGISTER LONG Var;
  1969.  
  1970.   if (Color != ReadPixel (Rp,a2,b2)) return FALSE;
  1971.  
  1972.   if (Color != ReadPixel (Rp,a2,b1)) return FALSE;
  1973.  
  1974.   if (Color != ReadPixel (Rp,a1,b2)) return FALSE;
  1975.  
  1976.   for (Var = (a1 + 1L); Var <= (a2 - 1L); Var++)
  1977.   {
  1978.       if (Color != ReadPixel (Rp,Var,b1)) return FALSE;
  1979.  
  1980.       if (Color != ReadPixel (Rp,Var,b2)) return FALSE;
  1981.   }
  1982.  
  1983.   for (Var = (b1 + 1L); Var <= (b2 - 1L); Var++)
  1984.   {
  1985.       if (Color != ReadPixel (Rp,a1,Var)) return FALSE;
  1986.  
  1987.       if (Color != ReadPixel (Rp,a2,Var)) return FALSE;
  1988.   }
  1989.  
  1990.   return TRUE;
  1991. }
  1992.  
  1993. BOOL Rectangle (struct Window *Win,const LONG a1,const LONG b1,const LONG a2,const LONG b2)
  1994. {
  1995. struct IntuiMessage *Message;
  1996.  
  1997. UWORD MyCode;
  1998.  
  1999. LONG helpx,helpy;
  2000.  
  2001. ULONG MyClass;
  2002.  
  2003.  if (Win->UserPort->mp_SigBit)
  2004.  {
  2005.     if (Message = (struct IntuiMessage *) GT_GetIMsg (Win->UserPort))
  2006.     {
  2007.        MyClass = Message->Class;
  2008.  
  2009.        MyCode  = Message->Code;
  2010.  
  2011.        GT_ReplyIMsg ((struct IntuiMessage *) Message);
  2012.  
  2013.        switch (MyClass)
  2014.        {
  2015.          case IDCMP_MENUPICK    : if (MyCode != MENUNULL)
  2016.                                   {
  2017.                                      if (ProcessMenu (Win,MyCode) & STOP_MSG) return TRUE;
  2018.                                   }
  2019.  
  2020.                                   break;
  2021.  
  2022.          case IDCMP_RAWKEY      : if (MyCode == TAB) return FALSE;
  2023.  
  2024.                                   if (MyCode == RAW_ESC) return TRUE;
  2025.  
  2026.                                   break;
  2027.  
  2028.          case IDCMP_CLOSEWINDOW : return TRUE;
  2029.        }
  2030.     }
  2031.  }
  2032.  
  2033.  helpx = a2 - a1;
  2034.  
  2035.  helpy = b2 - b1;
  2036.  
  2037.  if ((helpx < MINLIMIT) || (helpy < MINLIMIT)) return FALSE;
  2038.  
  2039.  if (CheckBox (Win->RPort,a1,b1,a2,b2))
  2040.  {
  2041.     SetAPen (Win->RPort,ReadPixel (Win->RPort,a1,b1));
  2042.  
  2043.     RectFill (Win->RPort,a1,b1,a2,b2);
  2044.  
  2045.     return FALSE;
  2046.  }
  2047.  
  2048.  if ((helpx < (MINLIMIT << 1L)) || (helpy < (MINLIMIT << 1L)))
  2049.  {
  2050.     for (helpy = (b1 + 1L); helpy <= (b2 - 1L); helpy++)
  2051.     {
  2052.         H_LINE (Win->RPort,a1+1L,a2-1L,helpy);
  2053.     }
  2054.  
  2055.     return FALSE;
  2056.  }
  2057.  
  2058.  if (helpx >= helpy)
  2059.  {
  2060.     helpx = (a1 + a2) >> 1L;
  2061.  
  2062.     V_LINE (Win->RPort,b1+1L,b2-1L,helpx);
  2063.  
  2064.     if (Rectangle (Win,a1,b1,helpx,b2)) return TRUE;
  2065.  
  2066.     if (Rectangle (Win,helpx,b1,a2,b2)) return TRUE;
  2067.  }
  2068.  
  2069.  else
  2070.  {
  2071.     helpy = (b1 + b2) >> 1L;
  2072.  
  2073.     H_LINE (Win->RPort,a1+1L,a2-1L,helpy);
  2074.  
  2075.     if (Rectangle (Win,a1,b1,a2,helpy)) return TRUE;
  2076.  
  2077.     if (Rectangle (Win,a1,helpy,a2,b2)) return TRUE;
  2078.  }
  2079.  
  2080.  return FALSE;
  2081. }
  2082.  
  2083. ULONG DrawFractal (struct Window *Win,const LONG a1,const LONG b1,const LONG a2,const LONG b2)
  2084. {
  2085. ULONG StartSec = NULL , EndSec = NULL , Dummy = NULL;
  2086.  
  2087.  CurrentTime (&StartSec,&Dummy);
  2088.  
  2089.  INCREMREAL = (fabs (RMAX-RMIN)) / ((long double) (a2 - a1 + 1L));
  2090.  
  2091.  INCREMIMAG = (fabs (IMAX-IMIN)) / ((long double) (b2 - b1 + 1L));
  2092.  
  2093.  MAX_ITERATIONS_PLUS_ONE = MAX_ITERATIONS + 1;
  2094.  
  2095.  if (TMASK & MASK) ShowTitle (Win->WScreen,FALSE);
  2096.  
  2097.  H_LINE (Win->RPort,a1,a2,b1);
  2098.  
  2099.  V_LINE (Win->RPort,b1+1L,b2-1L,a2);
  2100.  
  2101.  H_LINE (Win->RPort,a1,a2,b2);
  2102.  
  2103.  V_LINE (Win->RPort,b1+1L,b2-1L,a1);
  2104.  
  2105.  Rectangle (Win,a1,b1,a2,b2);
  2106.  
  2107.  if (TMASK & MASK) ShowTitle (Win->WScreen,TRUE);
  2108.  
  2109.  CurrentTime (&EndSec,&Dummy);
  2110.  
  2111.  return (EndSec-StartSec);
  2112. }
  2113.  
  2114. BOOL Preview (struct Window *Win,const LONG Width,const LONG Height)
  2115. {
  2116. struct Window *PreviewWin;
  2117.  
  2118. struct IntuiMessage *Message;
  2119.  
  2120. BOOL Error = FALSE;
  2121.  
  2122. UWORD MyCode = 0;
  2123.  
  2124. ULONG MyClass = NULL;
  2125.  
  2126.  MYBITMAP = CopyBitMap (Win,ZOOMLINE [6],ZOOMLINE [3],ZOOMLINE [4]-ZOOMLINE [6]+1,ZOOMLINE [5]-ZOOMLINE [3]+1);
  2127.  
  2128.  PreviewWin = OpenWindowTags (0,WA_Left,Win->LeftEdge + 10,
  2129.                                 WA_Top,Win->TopEdge + 15,
  2130.                                 WA_Width,(WORD) (Width  >> 1L),
  2131.                                 WA_Height,(WORD) (Height >> 1L),
  2132.                                 WA_Title,"Preview window",
  2133.                                 WA_ScreenTitle,"¼ Window preview...",
  2134.                                 WA_CustomScreen,Win->WScreen,
  2135.                                 WA_IDCMP,IDCMP_RAWKEY|IDCMP_CLOSEWINDOW,
  2136.                                 WA_Flags,WFLG_ACTIVATE|WFLG_CLOSEGADGET|WFLG_DRAGBAR|WFLG_NOCAREREFRESH|WFLG_SMART_REFRESH|WFLG_RMBTRAP|WFLG_GIMMEZEROZERO,
  2137.                                 TAG_END);
  2138.  if (PreviewWin)
  2139.  {
  2140.     PasteWin (MYBITMAP,PreviewWin,ZOOMLINE [4]-ZOOMLINE [6]+1,ZOOMLINE [5]-ZOOMLINE [3]+1);
  2141.  
  2142.     PutPointer (PreviewWin,ZZZPointer,ZZZPW,ZZZPH,ZZZPXO,ZZZPYO,1);
  2143.  
  2144.     ELAPSEDTIME = DrawFractal (PreviewWin,0L,0L,(LONG) (PreviewWin->GZZWidth) - 1L,(LONG) (PreviewWin->GZZHeight) - 1L);
  2145.  
  2146.     PutPointer (PreviewWin,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,2);
  2147.  
  2148.     ShowTime (Win,"Preview elapsed time:",ELAPSEDTIME);
  2149.  
  2150.     while (1L)
  2151.     {
  2152.          WaitPort (PreviewWin->UserPort);
  2153.  
  2154.          if (Message = (struct IntuiMessage *) GT_GetIMsg (PreviewWin->UserPort))
  2155.          {
  2156.                 MyClass = Message->Class;
  2157.  
  2158.                 MyCode  = Message->Code;
  2159.  
  2160.                 GT_ReplyIMsg ((struct IntuiMessage *) Message);
  2161.          }
  2162.  
  2163.          if (MyClass == IDCMP_CLOSEWINDOW) break;
  2164.  
  2165.          if ((MyClass == IDCMP_RAWKEY) && (MyCode == RAW_ESC)) break;
  2166.     }
  2167.  
  2168.     PutPointer (PreviewWin,0,0,0,0,0,0);
  2169.  
  2170.     CloseWindow (PreviewWin);
  2171.  }
  2172.  
  2173.  else
  2174.  {
  2175.     if (BMASK & MASK)
  2176.     {
  2177.        FreeBitMap (MYBITMAP);
  2178.  
  2179.        MASK ^= BMASK;
  2180.     }
  2181.  
  2182.     Fail (PreviewWindowError,15L);
  2183.  
  2184.     Error = TRUE;
  2185.  }
  2186.  
  2187.  return Error;
  2188. }
  2189.  
  2190. BOOL DrawFrame (struct Window *Win,WORD Zx,WORD Zy,WORD Zw,WORD Zh)
  2191. {
  2192. WORD LeftEdge,TopEdge,RightEdge,BottomEdge;
  2193.  
  2194.   if ((Zx > 2) && (Zy > 2) && (Zx < Win->Width - 2) && (Zy < Win->Height - 2) && ((Zw >= INITIALZOOM) || (Zh >= INITIALZOOM)))
  2195.   {
  2196.      LeftEdge   = Zx - Zw;
  2197.  
  2198.      TopEdge    = Zy - Zh;
  2199.  
  2200.      RightEdge  = Zx + Zw;
  2201.  
  2202.      BottomEdge = Zy + Zh;
  2203.  
  2204.      if ((LeftEdge >= 0) && (TopEdge >= 0) && (RightEdge <= Win->Width) && (BottomEdge <= Win->Height))
  2205.      {
  2206.         ZOOMLINE [8] = ZOOMLINE [0] = ZOOMLINE [6] = LeftEdge;
  2207.  
  2208.         ZOOMLINE [1] = ZOOMLINE [3] = TopEdge;
  2209.  
  2210.         ZOOMLINE [2] = ZOOMLINE [4] = RightEdge;
  2211.  
  2212.         ZOOMLINE [5] = ZOOMLINE [7] = BottomEdge;
  2213.  
  2214.         ZOOMLINE [9] = ZOOMLINE [1] + 1;
  2215.      }
  2216.  
  2217.      DrawBorder (Win->RPort,&MYBORDER,0,0);
  2218.  
  2219.      MASK |= ZMASK;
  2220.   }
  2221.  
  2222.   else MASK ^= ZMASK;
  2223.  
  2224.   return (BOOL) (ZMASK & MASK);
  2225. }
  2226.  
  2227. BOOL FileRequest (struct Window *Win,TEXT *String,TEXT *DrawerTxt,BOOL DrawerType,BOOL Save)
  2228. {
  2229. struct FileRequester *MyFileReq;
  2230.  
  2231. BOOL Success = FALSE;
  2232.  
  2233.  if (MyFileReq = AllocAslRequest (ASL_FileRequest,0))
  2234.  {
  2235.     MYDIR = (DrawerType ? PALETTESDIR : PICTURESDIR);
  2236.  
  2237.     if (! strlen (MYDIR)) strcpy (MYDIR,DrawerTxt);
  2238.  
  2239.     if (AslRequestTags (MyFileReq,ASLFR_Window,Win,
  2240.                                   ASLFR_InitialLeftEdge,Win->LeftEdge + 15,
  2241.                                   ASLFR_InitialTopEdge,Win->TopEdge + 25,
  2242.                                   ASLFR_InitialWidth,300,
  2243.                                   ASLFR_InitialHeight,((Win->Height) * 7) >> 3,
  2244.                                   ASLFR_SleepWindow,TRUE,
  2245.                                   ASLFR_TextAttr,&MYFONTSTRUCT,
  2246.                                   ASLFR_TitleText,String,
  2247.                                   ASLFR_InitialDrawer,MYDIR,
  2248.                                   ASLFR_InitialFile,MYFILE,
  2249.                                   ASLFR_DoSaveMode,Save,
  2250.                                   ASLFR_RejectIcons,TRUE,
  2251.                                   TAG_END))
  2252.     {
  2253.        strcpy (MYFILE,MyFileReq->rf_File);
  2254.  
  2255.        strcpy (MYDIR,MyFileReq->rf_Dir);
  2256.  
  2257.        strcpy (MYPATH,MYDIR);
  2258.  
  2259.        Success = AddPart (MYPATH,MYFILE,sizeof (MYPATH));
  2260.     }
  2261.  
  2262.     FreeAslRequest (MyFileReq);
  2263.  }
  2264.  
  2265.  return Success;
  2266. }
  2267.  
  2268. BOOL FontRequest (struct Window *Win)
  2269. {
  2270. struct FontRequester *MyFontReq;
  2271.  
  2272. BOOL Success = FALSE;
  2273.  
  2274.  if (MyFontReq = AllocAslRequest (ASL_FontRequest,0))
  2275.  {
  2276.     if (AslRequestTags (MyFontReq,ASLFO_Window,Win,
  2277.                                   ASLFO_InitialLeftEdge,Win->LeftEdge + 15,
  2278.                                   ASLFO_InitialTopEdge,Win->TopEdge + 25,
  2279.                                   ASLFO_InitialWidth,300,
  2280.                                   ASLFO_InitialHeight,((Win->Height) * 7) >> 3,
  2281.                                   ASLFO_SleepWindow,TRUE,
  2282.                                   ASLFO_TextAttr,&MYFONTSTRUCT,
  2283.                                   ASLFO_TitleText,"Font requester",
  2284.                                   ASLFO_InitialName,MYFONTSTRUCT.ta_Name,
  2285.                                   ASLFO_InitialSize,MYFONTSTRUCT.ta_YSize,
  2286.                                   ASLFO_InitialStyle,MYFONTSTRUCT.ta_Style,
  2287.                                   ASLFO_InitialFlags,MYFONTSTRUCT.ta_Flags,
  2288.                                   ASLFO_DoFrontPen,TRUE,
  2289.                                   ASLFO_DoBackPen,TRUE,
  2290.                                   ASLFO_DoStyle,TRUE,
  2291.                                   ASLFO_DoDrawMode,TRUE,
  2292.                                   ASLFO_MinHeight,8,
  2293.                                   TAG_END))
  2294.     {
  2295.       strcpy (MYFONTSTRUCT.ta_Name,MyFontReq->fo_Attr.ta_Name);
  2296.  
  2297.       MYFONTSTRUCT.ta_YSize = MyFontReq->fo_Attr.ta_YSize;
  2298.  
  2299.       MYFONTSTRUCT.ta_Style = MyFontReq->fo_Attr.ta_Style;
  2300.  
  2301.       MYFONTSTRUCT.ta_Flags = MyFontReq->fo_Attr.ta_Flags;
  2302.  
  2303.       Success = TRUE;
  2304.     }
  2305.  
  2306.     FreeAslRequest (MyFontReq);
  2307.  }
  2308.  
  2309.  return Success;
  2310. }
  2311.  
  2312. LONG __asm __interrupt __saveds SMFilterFunc (register __a0 struct Hook *Hook,register __a1 ULONG DisplayID,register __a2 struct ScreenModeRequester *SMReq)
  2313. {
  2314. DisplayInfoHandle DisplayHandle;
  2315.  
  2316. struct DisplayInfo DisplayInfo;
  2317.  
  2318. struct DimensionInfo DimensionInfo;
  2319.  
  2320.   DisplayHandle = FindDisplayInfo (DisplayID);
  2321.  
  2322.   if (GetDisplayInfoData (DisplayHandle,(UBYTE *) &DisplayInfo,sizeof (struct DisplayInfo),DTAG_DISP,DisplayID))
  2323.   {
  2324.      if (GetDisplayInfoData (DisplayHandle,(UBYTE *) &DimensionInfo,sizeof (struct DimensionInfo),DTAG_DIMS,DisplayID))
  2325.      {
  2326.         return ((DimensionInfo.MaxDepth <= MAX_DEPTH) && ((DisplayInfo.PropertyFlags & DIPF_IS_WB) || (DisplayInfo.PropertyFlags & DIPF_IS_EXTRAHALFBRITE)));
  2327.      }
  2328.   }
  2329.  
  2330.   return FALSE;
  2331. }
  2332.  
  2333. BOOL SMRequest (struct ILBMInfo *Ilbm)
  2334. {
  2335. struct ScreenModeRequester *SMReq;
  2336.  
  2337. struct Window *Win = Ilbm->win;
  2338.  
  2339. BOOL NewScreen = FALSE;
  2340.  
  2341.  if (SMReq = AllocAslRequest (ASL_ScreenModeRequest,NULL))
  2342.  {
  2343.     if (AslRequestTags (SMReq,ASLSM_Window,Win,
  2344.                               ASLSM_SleepWindow,TRUE,
  2345.                               ASLSM_TitleText,"ScreenMode requester",
  2346.                               ASLSM_InitialLeftEdge,Win->LeftEdge + 15,
  2347.                               ASLSM_InitialTopEdge,Win->TopEdge + 25,
  2348.                               ASLSM_InitialWidth,310,
  2349.                               ASLSM_InitialHeight,((Win->Height) * 7) >> 3,
  2350.                               ASLSM_InitialDisplayID,GetVPModeID (ViewPortAddress (Win)),
  2351.                               ASLSM_InitialDisplayWidth,Win->Width,
  2352.                               ASLSM_InitialDisplayHeight,Win->Height,
  2353.                               ASLSM_InitialDisplayDepth,Win->RPort->BitMap->Depth,
  2354.                               ASLSM_InitialOverscanType,Ilbm->ucliptype,
  2355.                               ASLSM_InitialInfoOpened,TRUE,
  2356.                               ASLSM_InitialInfoLeftEdge,Win->LeftEdge + 310 + 15,
  2357.                               ASLSM_InitialInfoTopEdge,Win->TopEdge,
  2358.                               ASLSM_DoWidth,TRUE,
  2359.                               ASLSM_DoHeight,TRUE,
  2360.                               ASLSM_DoDepth,TRUE,
  2361.                               ASLSM_DoOverscanType,TRUE,
  2362.                               ASLSM_MinDepth,MIN_DEPTH,
  2363.                               ASLSM_MaxDepth,MAX_DEPTH,
  2364.                               ASLSM_PropertyFlags,DIPF_IS_WB|DIPF_IS_EXTRAHALFBRITE,
  2365.                               ASLSM_PropertyMask,DIPF_IS_DUALPF|DIPF_IS_PF2PRI|DIPF_IS_HAM,
  2366.                               ASLSM_FilterFunc,&SMFILTERHOOK,
  2367.                               ASLSM_MinWidth,MIN_WIDTH,
  2368.                               ASLSM_MinHeight,MIN_HEIGHT,
  2369.                               TAG_END))
  2370.     {
  2371.        Ilbm->camg = SMReq->sm_DisplayID;
  2372.  
  2373.        Ilbm->Bmhd.w = SMReq->sm_DisplayWidth;
  2374.  
  2375.        Ilbm->Bmhd.h = SMReq->sm_DisplayHeight;
  2376.  
  2377.        Ilbm->Bmhd.nPlanes = SMReq->sm_DisplayDepth;
  2378.  
  2379.        Ilbm->ucliptype = SMReq->sm_OverscanType;
  2380.  
  2381.        NewScreen = TRUE;
  2382.     }
  2383.  
  2384.     FreeAslRequest (SMReq);
  2385.  }
  2386.  
  2387.  return NewScreen;
  2388. }
  2389.  
  2390. VOID SetMenuStart (struct Window *Win)
  2391. {
  2392.   OnMenu  (Win,FULLMENUNUM (0,0,NOSUB));
  2393.  
  2394.   OnMenu  (Win,FULLMENUNUM (0,2,NOSUB));
  2395.  
  2396.   OnMenu  (Win,FULLMENUNUM (0,3,NOSUB));
  2397.  
  2398.   OnMenu  (Win,FULLMENUNUM (0,4,NOSUB));
  2399.  
  2400.   OnMenu  (Win,FULLMENUNUM (0,5,NOSUB));
  2401.  
  2402.   OnMenu  (Win,FULLMENUNUM (0,7,NOSUB));
  2403.  
  2404.   OnMenu  (Win,FULLMENUNUM (0,9,NOSUB));
  2405.  
  2406.   OnMenu  (Win,FULLMENUNUM (1,0,NOSUB));
  2407.  
  2408.   OnMenu  (Win,FULLMENUNUM (1,1,NOSUB));
  2409.  
  2410.   OnMenu  (Win,FULLMENUNUM (1,2,NOSUB));
  2411.  
  2412.   OnMenu  (Win,FULLMENUNUM (1,4,NOSUB));
  2413.  
  2414.   OnMenu  (Win,FULLMENUNUM (2,2,NOSUB));
  2415.  
  2416.   OnMenu  (Win,FULLMENUNUM (2,4,NOSUB));
  2417.  
  2418.   OffMenu (Win,FULLMENUNUM (2,7,NOSUB));
  2419.  
  2420.   OnMenu  (Win,FULLMENUNUM (3,0,NOSUB));
  2421.  
  2422.   OnMenu  (Win,FULLMENUNUM (3,2,NOSUB));
  2423.  
  2424.   OnMenu  (Win,FULLMENUNUM (3,4,NOSUB));
  2425.  
  2426.   OnMenu  (Win,FULLMENUNUM (3,6,NOSUB));
  2427. }
  2428.  
  2429. VOID SetMenuStop (struct Window *Win)
  2430. {
  2431.   OffMenu  (Win,FULLMENUNUM (0,0,NOSUB));
  2432.  
  2433.   OffMenu  (Win,FULLMENUNUM (0,2,NOSUB));
  2434.  
  2435.   OffMenu  (Win,FULLMENUNUM (0,3,NOSUB));
  2436.  
  2437.   OffMenu  (Win,FULLMENUNUM (0,4,NOSUB));
  2438.  
  2439.   OffMenu  (Win,FULLMENUNUM (0,5,NOSUB));
  2440.  
  2441.   OffMenu  (Win,FULLMENUNUM (0,7,NOSUB));
  2442.  
  2443.   OffMenu  (Win,FULLMENUNUM (0,9,NOSUB));
  2444.  
  2445.   OffMenu  (Win,FULLMENUNUM (1,0,NOSUB));
  2446.  
  2447.   OffMenu  (Win,FULLMENUNUM (1,1,NOSUB));
  2448.  
  2449.   OffMenu  (Win,FULLMENUNUM (1,2,NOSUB));
  2450.  
  2451.   OffMenu  (Win,FULLMENUNUM (1,4,NOSUB));
  2452.  
  2453.   OffMenu  (Win,FULLMENUNUM (2,0,NOSUB));
  2454.  
  2455.   OffMenu  (Win,FULLMENUNUM (2,2,NOSUB));
  2456.  
  2457.   OffMenu  (Win,FULLMENUNUM (2,4,NOSUB));
  2458.  
  2459.   OffMenu  (Win,FULLMENUNUM (2,6,NOSUB));
  2460.  
  2461.   OnMenu   (Win,FULLMENUNUM (2,7,NOSUB));
  2462.  
  2463.   OffMenu  (Win,FULLMENUNUM (3,0,NOSUB));
  2464.  
  2465.   OffMenu  (Win,FULLMENUNUM (3,2,NOSUB));
  2466.  
  2467.   OffMenu  (Win,FULLMENUNUM (3,4,NOSUB));
  2468.  
  2469.   OffMenu  (Win,FULLMENUNUM (3,6,NOSUB));
  2470. }
  2471.  
  2472. ULONG ProcessMenu (struct Window *Win,UWORD Code)
  2473. {
  2474. struct MenuItem *Item;
  2475.  
  2476. ULONG Choice = NULL;
  2477.  
  2478.  while (Code != MENUNULL)
  2479.  {
  2480.   Item = ItemAddress (MAINMENU,Code);
  2481.  
  2482.   switch (MENUNUM (Code))
  2483.   {
  2484.         case 0:    switch (ITEMNUM (Code))
  2485.                    {
  2486.                         case 0: Choice |= ABOUT_MSG;
  2487.  
  2488.                                 break;
  2489.  
  2490.                         case 2: Choice |= LOADPICTURE_MSG;
  2491.  
  2492.                                 break;
  2493.  
  2494.                         case 3: Choice |= SAVEPICTURE_MSG;
  2495.  
  2496.                                 break;
  2497.  
  2498.                         case 4: Choice |= LOADPALETTE_MSG;
  2499.  
  2500.                                 break;
  2501.  
  2502.                         case 5: Choice |= SAVEPALETTE_MSG;
  2503.  
  2504.                                 break;
  2505.  
  2506.                         case 7: Choice |= DUMP_MSG;
  2507.  
  2508.                                 break;
  2509.  
  2510.                         case 9: Choice |= EXIT_MSG;
  2511.  
  2512.                                 break;
  2513.                    }
  2514.  
  2515.                    break;
  2516.  
  2517.         case 1:    switch (ITEMNUM (Code))
  2518.                    {
  2519.                         case 0: switch (SUBNUM (Code))
  2520.                                 {
  2521.                                    case 0: Choice |= TITLE_MSG;
  2522.  
  2523.                                            break;
  2524.  
  2525.                                    case 2: Choice |= TIME_MSG;
  2526.  
  2527.                                            break;
  2528.                                 }
  2529.  
  2530.                                 break;
  2531.  
  2532.                         case 1: Choice |= COORDS_MSG;
  2533.  
  2534.                                 break;
  2535.  
  2536.                         case 2: switch (SUBNUM (Code))
  2537.                                 {
  2538.                                    case 0: MAX_ITERATIONS = 63;
  2539.  
  2540.                                            break;
  2541.  
  2542.                                    case 1: MAX_ITERATIONS = 127;
  2543.  
  2544.                                            break;
  2545.  
  2546.                                    case 2: MAX_ITERATIONS = 191;
  2547.  
  2548.                                            break;
  2549.  
  2550.                                    case 3: MAX_ITERATIONS = 255;
  2551.  
  2552.                                            break;
  2553.  
  2554.                                    case 4: MAX_ITERATIONS = 319;
  2555.  
  2556.                                            break;
  2557.  
  2558.                                    case 5: MAX_ITERATIONS = 383;
  2559.  
  2560.                                            break;
  2561.  
  2562.                                    case 6: MAX_ITERATIONS = 447;
  2563.  
  2564.                                            break;
  2565.  
  2566.                                    case 7: MAX_ITERATIONS = 511;
  2567.  
  2568.                                            break;
  2569.  
  2570.                                    case 8: MAX_ITERATIONS = 1023;
  2571.  
  2572.                                            break;
  2573.  
  2574.                                   case 10: Choice |= ITER_MSG;
  2575.  
  2576.                                            break;
  2577.                                 }
  2578.  
  2579.                                 break;
  2580.  
  2581.                         case 3: switch (SUBNUM (Code))
  2582.                                 {
  2583.                                    case  0: PRIORITY = -5;
  2584.  
  2585.                                             break;
  2586.  
  2587.                                    case  1: PRIORITY = -4;
  2588.  
  2589.                                             break;
  2590.  
  2591.                                    case  2: PRIORITY = -3;
  2592.  
  2593.                                             break;
  2594.  
  2595.                                    case  3: PRIORITY = -2;
  2596.  
  2597.                                             break;
  2598.  
  2599.                                    case  4: PRIORITY = -1;
  2600.  
  2601.                                             break;
  2602.  
  2603.                                    case  6: PRIORITY =  0;
  2604.  
  2605.                                             break;
  2606.  
  2607.                                    case  8: PRIORITY =  1;
  2608.  
  2609.                                             break;
  2610.  
  2611.                                    case  9: PRIORITY =  2;
  2612.  
  2613.                                             break;
  2614.  
  2615.                                    case 10: PRIORITY =  3;
  2616.  
  2617.                                             break;
  2618.  
  2619.                                    case 11: PRIORITY =  4;
  2620.  
  2621.                                             break;
  2622.  
  2623.                                    case 12: PRIORITY =  5;
  2624.  
  2625.                                             break;
  2626.  
  2627.                                 }
  2628.  
  2629.                                 Forbid ();
  2630.  
  2631.                                 THISTASK = FindTask (NULL);
  2632.  
  2633.                                 Permit ();
  2634.  
  2635.                                 SetTaskPri (THISTASK,PRIORITY);
  2636.  
  2637.                                 break;
  2638.  
  2639.                         case 4: switch (SUBNUM (Code))
  2640.                                 {
  2641.                                    case 0: if (CheckEHB (MYILBM.camg))
  2642.                                            {
  2643.                                               H_LINE = HLine_R_EHB;
  2644.  
  2645.                                               V_LINE = VLine_R_EHB;
  2646.                                            }
  2647.  
  2648.                                            else
  2649.                                            {
  2650.                                               H_LINE = HLine_R;
  2651.  
  2652.                                               V_LINE = VLine_R;
  2653.                                            }
  2654.  
  2655.                                            SPREAD = FALSE;
  2656.  
  2657.                                            break;
  2658.  
  2659.                                    case 1: if (CheckEHB (MYILBM.camg))
  2660.                                            {
  2661.                                               H_LINE = HLine_S_EHB;
  2662.  
  2663.                                               V_LINE = VLine_S_EHB;
  2664.                                            }
  2665.  
  2666.                                            else
  2667.                                            {
  2668.                                               H_LINE = HLine_S;
  2669.  
  2670.                                               V_LINE = VLine_S;
  2671.                                            }
  2672.  
  2673.                                            SPREAD = TRUE;
  2674.  
  2675.                                            break;
  2676.                                 }
  2677.  
  2678.                                 break;
  2679.  
  2680.                         case 5: switch (SUBNUM (Code))
  2681.                                 {
  2682.                                    case 0: FUNCTION = Integer;
  2683.  
  2684.                                            break;
  2685.  
  2686.                                    case 1: FUNCTION = Real;
  2687.  
  2688.                                            break;
  2689.                                 }
  2690.  
  2691.                                 break;
  2692.                    }
  2693.  
  2694.                    break;
  2695.  
  2696.         case 2: switch (ITEMNUM (Code))
  2697.                 {
  2698.                    case 0: Choice |= PREVIEW_MSG;
  2699.  
  2700.                            break;
  2701.  
  2702.                    case 2: Choice |= REDRAW_MSG;
  2703.  
  2704.                            break;
  2705.  
  2706.                    case 4: Choice |= UNDO_MSG;
  2707.  
  2708.                            break;
  2709.  
  2710.                    case 6: Choice |= DRAW_MSG;
  2711.  
  2712.                            break;
  2713.  
  2714.                    case 7: Choice |= STOP_MSG;
  2715.  
  2716.                            break;
  2717.                 }
  2718.  
  2719.                 break;
  2720.  
  2721.         case 3: switch (ITEMNUM (Code))
  2722.                 {
  2723.                    case 0: switch (SUBNUM (Code))
  2724.                            {
  2725.                               case 0: Choice |= CYCLERIGHT_MSG;
  2726.  
  2727.                                       break;
  2728.  
  2729.                               case 1: Choice |= CYCLELEFT_MSG;
  2730.  
  2731.                                       break;
  2732.  
  2733.                               case 3: Choice |= DELAY_MSG;
  2734.  
  2735.                                       break;
  2736.  
  2737.                            }
  2738.  
  2739.                            break;
  2740.  
  2741.                    case 2: Choice |= PALETTE_MSG;
  2742.  
  2743.                            break;
  2744.  
  2745.                    case 4: Choice |= NEWDISPLAY_MSG;
  2746.  
  2747.                            break;
  2748.  
  2749.                    case 6: Choice |= FONTREQ_MSG;
  2750.  
  2751.                            break;
  2752.                 }
  2753.   }
  2754.  
  2755.  Code = Item->NextSelect;
  2756.  }
  2757.  
  2758.  return Choice;
  2759. }
  2760.  
  2761. VOID ProcessMouse (struct Window *Win,WORD CurMouseX,WORD CurMouseY)
  2762. {
  2763. static WORD MX1 = 0 , MY1 = 0 , MX2 = 0 , MY2 = 0 , W = 0 , H = 0;
  2764.  
  2765. struct IntuiMessage *Message;
  2766.  
  2767. UWORD MyCode = 0,DefaultQueue;
  2768.  
  2769. ULONG MyClass = NULL;
  2770.  
  2771.    ModifyIDCMP (Win,IDCMP_MOUSEBUTTONS | IDCMP_MOUSEMOVE);
  2772.  
  2773.    DefaultQueue = SetMouseQueue (Win,10);
  2774.  
  2775.    if (ZMASK & MASK) DrawFrame (Win,MX1,MY1,W,H);
  2776.  
  2777.    MX1 = CurMouseX;
  2778.  
  2779.    MY1 = CurMouseY;
  2780.  
  2781.    W = INITIALZOOM;
  2782.  
  2783.    H = ScalerDiv (W,Win->Height,Win->Width);
  2784.  
  2785.    DrawFrame (Win,MX1,MY1,W,H);
  2786.  
  2787.    while (1L)
  2788.    {
  2789.      WaitPort (Win->UserPort);
  2790.  
  2791.      if (Message = (struct IntuiMessage *) GT_GetIMsg (Win->UserPort))
  2792.      {
  2793.         MyClass = Message->Class;
  2794.  
  2795.         MyCode = Message->Code;
  2796.  
  2797.         MX2 = Message->MouseX;
  2798.  
  2799.         MY2 = Message->MouseY;
  2800.  
  2801.         GT_ReplyIMsg ((struct IntuiMessage *) Message);
  2802.      }
  2803.  
  2804.      if (MyClass == IDCMP_MOUSEMOVE)
  2805.      {
  2806.         DrawFrame (Win,MX1,MY1,W,H);
  2807.  
  2808.         W = abs (MX1 - MX2);
  2809.  
  2810.         H = abs (MY1 - MY2);
  2811.  
  2812.         if (W > H) (W = ScalerDiv (H,Win->Width,Win->Height));
  2813.  
  2814.         else       (H = ScalerDiv (W,Win->Height,Win->Width));
  2815.  
  2816.         DrawFrame (Win,MX1,MY1,W,H);
  2817.      }
  2818.  
  2819.      else if ((MyClass == IDCMP_MOUSEBUTTONS) && (MyCode != SELECTDOWN)) break;
  2820.    }
  2821.  
  2822.    SetMouseQueue (Win,DefaultQueue);
  2823.  
  2824.    ModifyIDCMP (Win,IDCMP_STANDARD);
  2825.  
  2826.    if (ZMASK & MASK)
  2827.    {
  2828.       OnMenu  (Win,FULLMENUNUM (2,0,NOSUB));
  2829.  
  2830.       OnMenu  (Win,FULLMENUNUM (2,6,NOSUB));
  2831.    }
  2832.  
  2833.    else
  2834.    {
  2835.       OffMenu  (Win,FULLMENUNUM (2,0,NOSUB));
  2836.  
  2837.       OffMenu  (Win,FULLMENUNUM (2,6,NOSUB));
  2838.    }
  2839. }
  2840.  
  2841. ULONG HandleEvents (struct ILBMInfo *Ilbm)
  2842. {
  2843. struct IntuiMessage *Message;
  2844.  
  2845. WORD MouseX = 0,MouseY = 0;
  2846.  
  2847. UWORD MyCode = 0,Index;
  2848.  
  2849. LONG Error;
  2850.  
  2851. ULONG MyClass = NULL,MyMenu = NULL;
  2852.  
  2853. DOUBLE RealCoord,ImagCoord,ScrRatio,FracRatio;
  2854.  
  2855.  PutPointer (Ilbm->win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,2);
  2856.  
  2857.  do { WaitPort (Ilbm->win->UserPort);
  2858.  
  2859.       if (Message = (struct IntuiMessage *) GT_GetIMsg (Ilbm->win->UserPort))
  2860.       {
  2861.              MyClass = Message->Class;
  2862.  
  2863.              MyCode  = Message->Code;
  2864.  
  2865.              MouseX  = Message->MouseX;
  2866.  
  2867.              MouseY  = Message->MouseY;
  2868.  
  2869.              GT_ReplyIMsg ((struct IntuiMessage *) Message);
  2870.       }
  2871.  
  2872.       switch (MyClass)
  2873.       {
  2874.              case    IDCMP_MOUSEMOVE: if (TMASK & MASK)
  2875.                                       {
  2876.                                          RealCoord = RMIN + ((DOUBLE) MouseX * fabs (RMAX-RMIN) / (DOUBLE) (Ilbm->win->Width - 1));
  2877.  
  2878.                                          ImagCoord = IMAX - ((DOUBLE) MouseY * fabs (IMAX-IMIN) / (DOUBLE) (Ilbm->win->Height - 1));
  2879.  
  2880.                                          ScrRatio  = (DOUBLE) Ilbm->win->Width / (DOUBLE) Ilbm->win->Height;
  2881.  
  2882.                                          FracRatio = fabs (RMAX-RMIN) / fabs (IMAX-IMIN);
  2883.  
  2884.                                          sprintf (BAR_STRING,"Real %+2.16lf Imag %+2.16lfi W:H %.5lf R:I %.5lf",RealCoord,ImagCoord,ScrRatio,FracRatio);
  2885.  
  2886.                                          WaitTOF ();
  2887.  
  2888.                                          SetWindowTitles (Ilbm->win,(TEXT *) ~0,BAR_STRING);
  2889.                                       }
  2890.  
  2891.                                       break;
  2892.  
  2893.              case IDCMP_MOUSEBUTTONS: if (MyCode == SELECTDOWN) ProcessMouse (Ilbm->win,MouseX,MouseY);
  2894.  
  2895.                                       break;
  2896.  
  2897.              case     IDCMP_MENUPICK: MyMenu = ProcessMenu (Ilbm->win,MyCode);
  2898.  
  2899.                                       if (MyMenu & EXIT_MSG) break;
  2900.  
  2901.                                       if (MyMenu & TITLE_MSG)
  2902.                                       {
  2903.                                          if (TMASK & MASK) MASK ^= TMASK;
  2904.  
  2905.                                          else MASK |= TMASK;
  2906.  
  2907.                                          Ilbm->TBState = TMASK & MASK;
  2908.  
  2909.                                          ShowTitle (Ilbm->scr,Ilbm->TBState);
  2910.  
  2911.                                          break;
  2912.                                       }
  2913.  
  2914.                                       if (MyMenu & TIME_MSG)
  2915.                                       {
  2916.                                          if (! (TMASK & MASK)) ShowTitle (Ilbm->scr,TRUE);
  2917.  
  2918.                                          ShowTime (Ilbm->win,"Last calculating time:",ELAPSEDTIME);
  2919.  
  2920.                                          Delay (MYSECS);
  2921.  
  2922.                                          if (! (TMASK & MASK)) ShowTitle (Ilbm->scr,FALSE);
  2923.  
  2924.                                          break;
  2925.                                       }
  2926.  
  2927.                                       if (MyMenu & ITER_MSG)
  2928.                                       {
  2929.                                          ModifyIDCMP (Ilbm->win,NULL);
  2930.  
  2931.                                          ClearMenuStrip (Ilbm->win);
  2932.  
  2933.                                          while (1L)
  2934.                                          {
  2935.                                             MAX_ITERATIONS = (WORD) IntegerGad (Ilbm->win,"Iterations requester","Insert new iterations...","_Iterations",MAX_ITERATIONS + 1L) - 1L;
  2936.  
  2937.                                             if (MAX_ITERATIONS >= 15L) break;
  2938.  
  2939.                                             DisplayBeep (Ilbm->scr);
  2940.                                          }
  2941.  
  2942.                                          ResetMenuStrip (Ilbm->win,MAINMENU);
  2943.  
  2944.                                          ModifyIDCMP (Ilbm->win,IDCMP_STANDARD);
  2945.  
  2946.                                          break;
  2947.                                       }
  2948.  
  2949.                                       if (MyMenu & ABOUT_MSG)
  2950.                                       {
  2951.                                          ModifyIDCMP (Ilbm->win,NULL);
  2952.  
  2953.                                          ClearMenuStrip (Ilbm->win);
  2954.  
  2955.                                          About (Ilbm->win);
  2956.  
  2957.                                          ResetMenuStrip (Ilbm->win,MAINMENU);
  2958.  
  2959.                                          ModifyIDCMP (Ilbm->win,IDCMP_STANDARD);
  2960.  
  2961.                                          break;
  2962.                                       }
  2963.  
  2964.                                       if (MyMenu & PALETTE_MSG)
  2965.                                       {
  2966.                                          ModifyIDCMP (Ilbm->win,NULL);
  2967.  
  2968.                                          ClearMenuStrip (Ilbm->win);
  2969.  
  2970.                                          if (! ModifyPalette (Ilbm->win,Ilbm->win->LeftEdge + 10,Ilbm->win->TopEdge + 15,300,218,PALETTE)) Fail (PaletteRequesterError,15L);
  2971.  
  2972.                                          ResetMenuStrip (Ilbm->win,MAINMENU);
  2973.  
  2974.                                          ModifyIDCMP (Ilbm->win,IDCMP_STANDARD);
  2975.  
  2976.                                          break;
  2977.                                       }
  2978.  
  2979.                                       if (MyMenu & CYCLERIGHT_MSG)
  2980.                                       {
  2981.                                          ModifyIDCMP (Ilbm->win,IDCMP_MOUSEBUTTONS|IDCMP_RAWKEY|IDCMP_MENUPICK);
  2982.  
  2983.                                          if (TMASK & MASK) ShowTitle (Ilbm->scr,FALSE);
  2984.  
  2985.                                          ClearMenuStrip (Ilbm->win);
  2986.  
  2987.                                          PutPointer (Ilbm->win,ZZZPointer,ZZZPW,ZZZPH,ZZZPXO,ZZZPYO,1);
  2988.  
  2989.                                          Cycle (Ilbm->win,DELAY,SHIFTRIGHT);
  2990.  
  2991.                                          PutPointer (Ilbm->win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,2);
  2992.  
  2993.                                          ResetMenuStrip (Ilbm->win,MAINMENU);
  2994.  
  2995.                                          if (TMASK & MASK) ShowTitle (Ilbm->scr,TRUE);
  2996.  
  2997.                                          LoadRGB32 (ViewPortAddress (Ilbm->win),PALETTE);
  2998.  
  2999.                                          ModifyIDCMP (Ilbm->win,IDCMP_STANDARD);
  3000.  
  3001.                                          break;
  3002.                                       }
  3003.  
  3004.                                       if (MyMenu & CYCLELEFT_MSG)
  3005.                                       {
  3006.                                          ModifyIDCMP (Ilbm->win,IDCMP_MOUSEBUTTONS|IDCMP_RAWKEY|IDCMP_MENUPICK);
  3007.  
  3008.                                          if (TMASK & MASK) ShowTitle (Ilbm->scr,FALSE);
  3009.  
  3010.                                          ClearMenuStrip (Ilbm->win);
  3011.  
  3012.                                          PutPointer (Ilbm->win,ZZZPointer,ZZZPW,ZZZPH,ZZZPXO,ZZZPYO,1);
  3013.  
  3014.                                          Cycle (Ilbm->win,DELAY,SHIFTLEFT);
  3015.  
  3016.                                          PutPointer (Ilbm->win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,2);
  3017.  
  3018.                                          ResetMenuStrip (Ilbm->win,MAINMENU);
  3019.  
  3020.                                          if (TMASK & MASK) ShowTitle (Ilbm->scr,TRUE);
  3021.  
  3022.                                          LoadRGB32 (ViewPortAddress (Ilbm->win),PALETTE);
  3023.  
  3024.                                          ModifyIDCMP (Ilbm->win,IDCMP_STANDARD);
  3025.  
  3026.                                          break;
  3027.                                       }
  3028.  
  3029.                                       if (MyMenu & DELAY_MSG)
  3030.                                       {
  3031.                                          while (1L)
  3032.                                          {
  3033.                                             DELAY = IntegerGad (Ilbm->win,"Delay requester","Insert delay time...","_Delay time",DELAY);
  3034.  
  3035.                                             if (DELAY >= 0L) break;
  3036.  
  3037.                                             DisplayBeep (Ilbm->scr);
  3038.                                          }
  3039.  
  3040.                                          break;
  3041.                                       }
  3042.  
  3043.                                       if (MyMenu & STOP_MSG)
  3044.                                       {
  3045.                                          SetMenuStart (Ilbm->win);
  3046.  
  3047.                                          PutPointer (Ilbm->win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,2);
  3048.  
  3049.                                          break;
  3050.                                       }
  3051.  
  3052.                                       if (MyMenu & LOADPICTURE_MSG)
  3053.                                       {
  3054.                                          if (FileRequest (Ilbm->win,"Load iff picture","PROGDIR:Pictures",PICTURES_DRAWER,FALSE))
  3055.                                          {
  3056.                                             PutPointer (Ilbm->win,ZZZPointer,ZZZPW,ZZZPH,ZZZPXO,ZZZPYO,1);
  3057.  
  3058.                                             if (Ilbm->ParseInfo.iff = AllocIFF ())
  3059.                                             {
  3060.                                                if (! (Error = QueryMandPic (Ilbm,&MANDChunkTmp,MYPATH)))
  3061.                                                {
  3062.                                                   MANDChunk = *MANDChunkTmp;
  3063.                    
  3064.                                                   SaveCoords ();
  3065.  
  3066.                                                   RMIN = MANDChunk.RMin;
  3067.  
  3068.                                                   RMAX = MANDChunk.RMax;
  3069.  
  3070.                                                   IMIN = MANDChunk.IMin;
  3071.  
  3072.                                                   IMAX = MANDChunk.IMax;
  3073.  
  3074.                                                   MAX_ITERATIONS = MANDChunk.Iterations - 1L;
  3075.  
  3076.                                                   if (MANDChunk.Special & SPREAD_BIT) SPREAD = TRUE;
  3077.  
  3078.                                                   else SPREAD = FALSE;
  3079.  
  3080.                                                   if (MANDChunk.Special & INTEGER_BIT) FUNCTION = Integer;
  3081.  
  3082.                                                   else FUNCTION = Real;
  3083.  
  3084.                                                   CloseDisplay (Ilbm,VINFO);
  3085.  
  3086.                                                   Ilbm->IFFPFlags = IFFPF_BESTFIT;
  3087.  
  3088.                                                   COLOR_PENS = MakeDisplay (Ilbm);
  3089.  
  3090.                                                   Ilbm->IFFPFlags = NULL;
  3091.  
  3092.                                                   if (! COLOR_PENS)
  3093.                                                   {
  3094.                                                      Fail (MakeDisplayError,20L);
  3095.  
  3096.                                                      MyMenu = EXIT_MSG;
  3097.  
  3098.                                                      break;
  3099.                                                   }
  3100.  
  3101.                                                   if (ZMASK & MASK) MASK ^= ZMASK;
  3102.  
  3103.                                                   COLOR_PENS -= 4L;
  3104.  
  3105.                                                   if (TMASK & MASK) ShowTitle (Ilbm->scr,FALSE);
  3106.  
  3107.                                                   if (LoadMandPic (Ilbm,MYPATH)) Fail (LoadMandPicError,5L);
  3108.  
  3109.                                                   if (TMASK & MASK) ShowTitle (Ilbm->scr,TRUE);
  3110.  
  3111.                                                   if (CheckEHB (Ilbm->camg)) GetRGB32 (Ilbm->vp->ColorMap,0L,32L,&PALETTE [1L]);
  3112.  
  3113.                                                   else GetRGB32 (Ilbm->vp->ColorMap,0L,Ilbm->vp->ColorMap->Count,&PALETTE [1L]);
  3114.  
  3115.                                                   LoadRGB32 (Ilbm->vp,PALETTE);
  3116.  
  3117.                                                   ClearMenuStrip (Ilbm->win);
  3118.  
  3119.                                                   if (SPREAD)
  3120.                                                   {
  3121.                                                      if (ItemAddress (MAINMENU,FULLMENUNUM (1,4,0))->Flags & CHECKED) ItemAddress (MAINMENU,FULLMENUNUM (1,4,0))->Flags ^= CHECKED;
  3122.  
  3123.                                                      if (! (ItemAddress (MAINMENU,FULLMENUNUM (1,4,1))->Flags & CHECKED)) ItemAddress (MAINMENU,FULLMENUNUM (1,4,1))->Flags |= CHECKED;
  3124.  
  3125.                                                      if (CheckEHB (MYILBM.camg))
  3126.                                                      {
  3127.                                                         H_LINE = HLine_S_EHB;
  3128.  
  3129.                                                         V_LINE = VLine_S_EHB;
  3130.                                                      }
  3131.  
  3132.                                                      else
  3133.                                                      {
  3134.                                                         H_LINE = HLine_S;
  3135.  
  3136.                                                         V_LINE = VLine_S;
  3137.                                                      }
  3138.                                                   }
  3139.  
  3140.                                                   else
  3141.                                                   {
  3142.                                                      if (ItemAddress (MAINMENU,FULLMENUNUM (1,4,1))->Flags & CHECKED) ItemAddress (MAINMENU,FULLMENUNUM (1,4,1))->Flags ^= CHECKED;
  3143.  
  3144.                                                      if (! (ItemAddress (MAINMENU,FULLMENUNUM (1,4,0))->Flags & CHECKED)) ItemAddress (MAINMENU,FULLMENUNUM (1,4,0))->Flags |= CHECKED;
  3145.  
  3146.                                                      if (CheckEHB (MYILBM.camg))
  3147.                                                      {
  3148.                                                         H_LINE = HLine_R_EHB;
  3149.  
  3150.                                                         V_LINE = VLine_R_EHB;
  3151.                                                      }
  3152.  
  3153.                                                      else
  3154.                                                      {
  3155.                                                         H_LINE = HLine_R;
  3156.  
  3157.                                                         V_LINE = VLine_R;
  3158.                                                      }
  3159.                                                   }
  3160.  
  3161.                                                   for (Index = 0; Index <= 10; Index++) if (ItemAddress (MAINMENU,FULLMENUNUM (1,2,Index))->Flags & CHECKED) ItemAddress (MAINMENU,FULLMENUNUM (1,2,Index))->Flags ^= CHECKED;
  3162.  
  3163.                                                   switch (MAX_ITERATIONS)
  3164.                                                   {
  3165.                                                     case 63 :  if (! (ItemAddress (MAINMENU,FULLMENUNUM (1,2,0))->Flags & CHECKED)) ItemAddress (MAINMENU,FULLMENUNUM (1,2,0))->Flags |= CHECKED;
  3166.  
  3167.                                                                break;
  3168.  
  3169.                                                     case 127:  if (! (ItemAddress (MAINMENU,FULLMENUNUM (1,2,1))->Flags & CHECKED)) ItemAddress (MAINMENU,FULLMENUNUM (1,2,1))->Flags |= CHECKED;
  3170.  
  3171.                                                                break;
  3172.  
  3173.                                                     case 191:  if (! (ItemAddress (MAINMENU,FULLMENUNUM (1,2,2))->Flags & CHECKED)) ItemAddress (MAINMENU,FULLMENUNUM (1,2,2))->Flags |= CHECKED;
  3174.  
  3175.                                                                break;
  3176.  
  3177.                                                     case 255:  if (! (ItemAddress (MAINMENU,FULLMENUNUM (1,2,3))->Flags & CHECKED)) ItemAddress (MAINMENU,FULLMENUNUM (1,2,3))->Flags |= CHECKED;
  3178.  
  3179.                                                                break;
  3180.  
  3181.                                                     case 319:  if (! (ItemAddress (MAINMENU,FULLMENUNUM (1,2,4))->Flags & CHECKED)) ItemAddress (MAINMENU,FULLMENUNUM (1,2,4))->Flags |= CHECKED;
  3182.  
  3183.                                                                break;
  3184.  
  3185.                                                     case 383:  if (! (ItemAddress (MAINMENU,FULLMENUNUM (1,2,5))->Flags & CHECKED)) ItemAddress (MAINMENU,FULLMENUNUM (1,2,5))->Flags |= CHECKED;
  3186.  
  3187.                                                                break;
  3188.  
  3189.                                                     case 447:  if (! (ItemAddress (MAINMENU,FULLMENUNUM (1,2,6))->Flags & CHECKED)) ItemAddress (MAINMENU,FULLMENUNUM (1,2,6))->Flags |= CHECKED;
  3190.  
  3191.                                                                break;
  3192.  
  3193.                                                     case 511:  if (! (ItemAddress (MAINMENU,FULLMENUNUM (1,2,7))->Flags & CHECKED)) ItemAddress (MAINMENU,FULLMENUNUM (1,2,7))->Flags |= CHECKED;
  3194.  
  3195.                                                                break;
  3196.  
  3197.                                                     case 1023: if (! (ItemAddress (MAINMENU,FULLMENUNUM (1,2,8))->Flags & CHECKED)) ItemAddress (MAINMENU,FULLMENUNUM (1,2,8))->Flags |= CHECKED;
  3198.  
  3199.                                                                break;
  3200.  
  3201.                                                     default:   if (! (ItemAddress (MAINMENU,FULLMENUNUM (1,2,10))->Flags & CHECKED)) ItemAddress (MAINMENU,FULLMENUNUM (1,2,10))->Flags |= CHECKED;
  3202.  
  3203.                                                                break;
  3204.                                                   }
  3205.  
  3206.                                                   if (FUNCTION == Integer)
  3207.                                                   {
  3208.                                                      if (ItemAddress (MAINMENU,FULLMENUNUM (1,5,1))->Flags & CHECKED) ItemAddress (MAINMENU,FULLMENUNUM (1,5,1))->Flags ^= CHECKED;
  3209.  
  3210.                                                      if (! (ItemAddress (MAINMENU,FULLMENUNUM (1,5,0))->Flags & CHECKED)) ItemAddress (MAINMENU,FULLMENUNUM (1,5,0))->Flags |= CHECKED;
  3211.                                                   }
  3212.  
  3213.                                                   else
  3214.                                                   {
  3215.                                                      if (ItemAddress (MAINMENU,FULLMENUNUM (1,5,0))->Flags & CHECKED) ItemAddress (MAINMENU,FULLMENUNUM (1,5,0))->Flags ^= CHECKED;
  3216.  
  3217.                                                      if (! (ItemAddress (MAINMENU,FULLMENUNUM (1,5,1))->Flags & CHECKED)) ItemAddress (MAINMENU,FULLMENUNUM (1,5,1))->Flags |= CHECKED;
  3218.                                                   }
  3219.  
  3220.                                                   ResetMenuStrip (Ilbm->win,MAINMENU);
  3221.                                                }
  3222.  
  3223.                                                else Fail (QueryMandPicError,NULL);
  3224.  
  3225.                                                FreeIFF (Ilbm->ParseInfo.iff);
  3226.                                             }
  3227.                                          }
  3228.  
  3229.                                          PutPointer (Ilbm->win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,2);
  3230.  
  3231.                                          break;
  3232.                                       }
  3233.  
  3234.                                       if (MyMenu & SAVEPICTURE_MSG)
  3235.                                       {
  3236.                                          if (FileRequest (Ilbm->win,"Save iff picture","PROGDIR:Pictures",PICTURES_DRAWER,TRUE))
  3237.                                          {
  3238.                                             PutPointer (Ilbm->win,ZZZPointer,ZZZPW,ZZZPH,ZZZPXO,ZZZPYO,1);
  3239.  
  3240.                                             if (Ilbm->ParseInfo.iff = AllocIFF ())
  3241.                                             {
  3242.                                                MANDChunk.LeftEdge = Ilbm->win->LeftEdge;
  3243.  
  3244.                                                MANDChunk.TopEdge = Ilbm->win->TopEdge;
  3245.  
  3246.                                                MANDChunk.Width = Ilbm->win->Width;
  3247.  
  3248.                                                MANDChunk.Height = Ilbm->win->Height;
  3249.  
  3250.                                                MANDChunk.RMin = RMIN;
  3251.  
  3252.                                                MANDChunk.RMax = RMAX;
  3253.  
  3254.                                                MANDChunk.IMin = IMIN;
  3255.  
  3256.                                                MANDChunk.IMax = IMAX;
  3257.  
  3258.                                                MANDChunk.Iterations = MAX_ITERATIONS + 1L;
  3259.  
  3260.                                                MANDChunk.Special = NULL;
  3261.  
  3262.                                                if (SPREAD) MANDChunk.Special |= SPREAD_BIT;
  3263.  
  3264.                                                if (FUNCTION == Integer) MANDChunk.Special |= INTEGER_BIT;
  3265.  
  3266.                                                if (ZMASK & MASK)
  3267.                                                {
  3268.                                                   DrawBorder (Ilbm->wrp,&MYBORDER,0,0);
  3269.  
  3270.                                                   MASK ^= ZMASK;
  3271.                                                }
  3272.  
  3273.                                                if (TMASK & MASK) ShowTitle (Ilbm->scr,FALSE);
  3274.  
  3275.                                                if (SaveMandPic (Ilbm,&SPECIAL_CHUNK,©RIGHT_CHUNK,MYPATH)) Fail (SaveMandPicError,5L);
  3276.  
  3277.                                                if (TMASK & MASK) ShowTitle (Ilbm->scr,TRUE);
  3278.  
  3279.                                                FreeIFF (Ilbm->ParseInfo.iff);
  3280.                                             }
  3281.                                          }
  3282.  
  3283.                                          PutPointer (Ilbm->win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,2);
  3284.  
  3285.                                          break;
  3286.                                       }
  3287.  
  3288.                                       if (MyMenu & LOADPALETTE_MSG)
  3289.                                       {
  3290.                                          if (FileRequest (Ilbm->win,"Load palette","PROGDIR:Palettes",PALETTES_DRAWER,FALSE))
  3291.                                          {
  3292.                                             PutPointer (Ilbm->win,ZZZPointer,ZZZPW,ZZZPH,ZZZPXO,ZZZPYO,1);
  3293.  
  3294.                                             if (Ilbm->ParseInfo.iff = AllocIFF ())
  3295.                                             {
  3296.                                                LoadPalette (Ilbm,MYPATH);
  3297.  
  3298.                                                if (CheckEHB (Ilbm->camg)) GetRGB32 (Ilbm->vp->ColorMap,0L,32L,&PALETTE [1L]);
  3299.  
  3300.                                                else GetRGB32 (Ilbm->vp->ColorMap,0L,Ilbm->vp->ColorMap->Count,&PALETTE [1L]);
  3301.  
  3302.                                                LoadRGB32 (Ilbm->vp,PALETTE);
  3303.  
  3304.                                                FreeIFF (Ilbm->ParseInfo.iff);
  3305.                                             }
  3306.                                          }
  3307.  
  3308.                                          PutPointer (Ilbm->win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,2);
  3309.  
  3310.                                          break;
  3311.                                       }
  3312.  
  3313.                                       if (MyMenu & SAVEPALETTE_MSG)
  3314.                                       {
  3315.                                          if (FileRequest (Ilbm->win,"Save palette","PROGDIR:Palettes",PALETTES_DRAWER,TRUE))
  3316.                                          {
  3317.                                             PutPointer (Ilbm->win,ZZZPointer,ZZZPW,ZZZPH,ZZZPXO,ZZZPYO,1);
  3318.  
  3319.                                             if (Ilbm->ParseInfo.iff = AllocIFF ())
  3320.                                             {
  3321.                                                SavePalette (Ilbm,©RIGHT_CHUNK,MYPATH);
  3322.  
  3323.                                                FreeIFF (Ilbm->ParseInfo.iff);
  3324.                                             }
  3325.                                          }
  3326.  
  3327.                                          PutPointer (Ilbm->win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,2);
  3328.  
  3329.                                          break;
  3330.                                       }
  3331.  
  3332.                                       if (MyMenu & FONTREQ_MSG)
  3333.                                       {
  3334.                                          if (FontRequest (Ilbm->win))
  3335.                                          {
  3336.                                             PutPointer (Ilbm->win,ZZZPointer,ZZZPW,ZZZPH,ZZZPXO,ZZZPYO,1);
  3337.  
  3338.                                             MYBITMAP = CopyBitMap (Ilbm->win,Ilbm->win->LeftEdge,Ilbm->win->TopEdge,Ilbm->win->Width,Ilbm->win->Height);
  3339.  
  3340.                                             CloseDisplay (Ilbm,VINFO);
  3341.  
  3342.                                             if (NEWFONT = OpenDiskFont (&MYFONTSTRUCT)) MASK |= FMASK;
  3343.  
  3344.                                             else
  3345.                                             {
  3346.                                                strcpy (MYFONTSTRUCT.ta_Name,"topaz.font");
  3347.  
  3348.                                                MYFONTSTRUCT.ta_YSize = 9;
  3349.  
  3350.                                                MYFONTSTRUCT.ta_Style = FS_NORMAL;
  3351.  
  3352.                                                MYFONTSTRUCT.ta_Flags = FPF_ROMFONT;
  3353.  
  3354.                                                DisplayAlert (RECOVERY_ALERT,OpenDiskFontError,30);
  3355.                                             }
  3356.  
  3357.                                             if (! MakeDisplay (Ilbm))
  3358.                                             {
  3359.                                                Fail (MakeDisplayError,20L);
  3360.  
  3361.                                                MyMenu = EXIT_MSG;
  3362.  
  3363.                                                break;
  3364.                                             }
  3365.  
  3366.                                             PasteWin (MYBITMAP,Ilbm->win,Ilbm->win->Width,Ilbm->win->Height);
  3367.                                          }
  3368.  
  3369.                                          PutPointer (Ilbm->win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,2);
  3370.  
  3371.                                          break;
  3372.                                       }
  3373.  
  3374.                                       if (MyMenu & DUMP_MSG)
  3375.                                       {
  3376.                                          ModifyIDCMP (Ilbm->win,NULL);
  3377.  
  3378.                                          ClearMenuStrip (Ilbm->win);
  3379.  
  3380.                                          PutPointer (Ilbm->win,ZZZPointer,ZZZPW,ZZZPH,ZZZPXO,ZZZPYO,1);
  3381.  
  3382.                                          if (Choice (Ilbm->win,"Print requester","Are you sure ?"))
  3383.                                          {
  3384.                                             WinDump (Ilbm->win);
  3385.                                          }
  3386.  
  3387.                                          PutPointer (Ilbm->win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,2);
  3388.  
  3389.                                          ResetMenuStrip (Ilbm->win,MAINMENU);
  3390.  
  3391.                                          ModifyIDCMP (Ilbm->win,IDCMP_STANDARD);
  3392.  
  3393.                                          break;
  3394.                                       }
  3395.  
  3396.                                       if (MyMenu & PREVIEW_MSG)
  3397.                                       {
  3398.                                          if (NewCoords (Ilbm->win,ZOOMLINE [6],ZOOMLINE [3],ZOOMLINE [4],ZOOMLINE [5]))
  3399.                                          {
  3400.                                             ModifyIDCMP (Ilbm->win,NULL);
  3401.  
  3402.                                             ClearMenuStrip (Ilbm->win);
  3403.  
  3404.                                             Preview (Ilbm->win,Ilbm->win->Width,Ilbm->win->Height);
  3405.  
  3406.                                             ResetMenuStrip (Ilbm->win,MAINMENU);
  3407.  
  3408.                                             ModifyIDCMP (Ilbm->win,IDCMP_STANDARD);
  3409.  
  3410.                                             RestoreCoords ();
  3411.                                          }
  3412.  
  3413.                                          break;
  3414.                                       }
  3415.  
  3416.                                       if (MyMenu & COORDS_MSG)
  3417.                                       {
  3418.                                          ModifyIDCMP (Ilbm->win,NULL);
  3419.  
  3420.                                          ClearMenuStrip (Ilbm->win);
  3421.  
  3422.                                          if (ShowCoords (Ilbm->win))
  3423.                                          {
  3424.                                             if (Choice (Ilbm->win,"Rendering requester","Recalculate ?")) MyMenu |= REDRAW_MSG;
  3425.                                          }
  3426.  
  3427.                                          ResetMenuStrip (Ilbm->win,MAINMENU);
  3428.  
  3429.                                          ModifyIDCMP (Ilbm->win,IDCMP_STANDARD);
  3430.                                       }
  3431.  
  3432.                                       if (MyMenu & REDRAW_MSG)
  3433.                                       {
  3434.                                          if (ZMASK & MASK)
  3435.                                          {
  3436.                                             DrawBorder (Ilbm->wrp,&MYBORDER,0,0);
  3437.  
  3438.                                             MASK ^= ZMASK;
  3439.                                          }
  3440.  
  3441.                                          SetMenuStop (Ilbm->win);
  3442.  
  3443.                                          PutPointer (Ilbm->win,ZZZPointer,ZZZPW,ZZZPH,ZZZPXO,ZZZPYO,1);
  3444.  
  3445.                                          ELAPSEDTIME = DrawFractal (Ilbm->win,(LONG) (Ilbm->win->LeftEdge),(LONG) (Ilbm->win->TopEdge),(LONG) (Ilbm->win->Width) - 1L,(LONG) (Ilbm->win->Height) - 1L);
  3446.  
  3447.                                          PutPointer (Ilbm->win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,2);
  3448.  
  3449.                                          SetMenuStart (Ilbm->win);
  3450.  
  3451.                                          ShowTime (Ilbm->win,"Recalculate elapsed time:",ELAPSEDTIME);
  3452.  
  3453.                                          break;
  3454.                                       }
  3455.  
  3456.                                       if (MyMenu & UNDO_MSG)
  3457.                                       {
  3458.                                          if (ZMASK & MASK)
  3459.                                          {
  3460.                                             DrawBorder (Ilbm->wrp,&MYBORDER,0,0);
  3461.  
  3462.                                             MASK ^= ZMASK;
  3463.                                          }
  3464.  
  3465.                                          RestoreCoords ();
  3466.  
  3467.                                          PutPointer (Ilbm->win,ZZZPointer,ZZZPW,ZZZPH,ZZZPXO,ZZZPYO,1);
  3468.  
  3469.                                          SetMenuStop (Ilbm->win);
  3470.  
  3471.                                          SetRast (Ilbm->wrp,BLACK);
  3472.  
  3473.                                          ELAPSEDTIME = DrawFractal (Ilbm->win,(LONG) (Ilbm->win->LeftEdge),(LONG) (Ilbm->win->TopEdge),(LONG) (Ilbm->win->Width) - 1L,(LONG) (Ilbm->win->Height) - 1L);
  3474.  
  3475.                                          PutPointer (Ilbm->win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,2);
  3476.  
  3477.                                          SetMenuStart (Ilbm->win);
  3478.  
  3479.                                          ShowTime (Ilbm->win,"Undo elapsed time:",ELAPSEDTIME);
  3480.  
  3481.                                          break;
  3482.                                       }
  3483.  
  3484.                                       if (MyMenu & DRAW_MSG)
  3485.                                       {
  3486.                                          if (ZMASK & MASK)
  3487.                                          {
  3488.                                             DrawBorder (Ilbm->wrp,&MYBORDER,0,0);
  3489.  
  3490.                                             MASK ^= ZMASK;
  3491.                                          }
  3492.  
  3493.                                          if (NewCoords (Ilbm->win,ZOOMLINE [6],ZOOMLINE [3],ZOOMLINE [4],ZOOMLINE [5]))
  3494.                                          {
  3495.                                             MYBITMAP = CopyBitMap (Ilbm->win,ZOOMLINE [6],ZOOMLINE [3],ZOOMLINE [4]-ZOOMLINE [6]+1,ZOOMLINE [5]-ZOOMLINE [3]+1);
  3496.  
  3497.                                             PasteWin (MYBITMAP,Ilbm->win,ZOOMLINE [4]-ZOOMLINE [6]+1,ZOOMLINE [5]-ZOOMLINE [3]+1);
  3498.  
  3499.                                             SetMenuStop (Ilbm->win);
  3500.  
  3501.                                             PutPointer (Ilbm->win,ZZZPointer,ZZZPW,ZZZPH,ZZZPXO,ZZZPYO,1);
  3502.  
  3503.                                             ELAPSEDTIME = DrawFractal (Ilbm->win,(LONG) (Ilbm->win->LeftEdge),(LONG) (Ilbm->win->TopEdge),(LONG) (Ilbm->win->Width) - 1L,(LONG) (Ilbm->win->Height) - 1L);
  3504.  
  3505.                                             PutPointer (Ilbm->win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,2);
  3506.  
  3507.                                             SetMenuStart (Ilbm->win);
  3508.  
  3509.                                             ShowTime (Ilbm->win,"Zoom elapsed time:",ELAPSEDTIME);
  3510.                                          }
  3511.  
  3512.                                          break;
  3513.                                       }
  3514.  
  3515.                                       break;
  3516.  
  3517.              case       IDCMP_RAWKEY: if (MyCode == RAW_ESC) MyMenu = EXIT_MSG;
  3518.  
  3519.                                       break;
  3520.  
  3521.              case  IDCMP_CLOSEWINDOW: MyMenu = EXIT_MSG;
  3522.       }
  3523.  
  3524.     } while (! ((MyMenu & EXIT_MSG) || (MyMenu & NEWDISPLAY_MSG)));
  3525.  
  3526.     if (ZMASK & MASK)
  3527.     {
  3528.        DrawBorder (Ilbm->wrp,&MYBORDER,0,0);
  3529.  
  3530.        MASK ^= ZMASK;
  3531.     }
  3532.  
  3533.  return MyMenu;
  3534. }
  3535.  
  3536. struct BitMap *CopyBitMap (struct Window *Win,WORD Left,WORD Top,WORD Width,WORD Height)
  3537. {
  3538. struct BitMap *NewBM;
  3539.  
  3540.   NewBM = AllocBitMap (Width,Height,Win->RPort->BitMap->Depth,BMF_INTERLEAVED | BMF_CLEAR,NULL);
  3541.  
  3542.   if (NewBM)
  3543.   {
  3544.      if (ZMASK & MASK) DrawBorder (Win->RPort,&MYBORDER,0,0);
  3545.  
  3546.      if (TMASK & MASK) ShowTitle (Win->WScreen,FALSE);
  3547.  
  3548.      BltBitMap (Win->RPort->BitMap,Left,Top,NewBM,0,0,Width,Height,0xC0,0xFF,NULL);
  3549.  
  3550.      if (TMASK & MASK) ShowTitle (Win->WScreen,TRUE);
  3551.  
  3552.      if (ZMASK & MASK) DrawBorder (Win->RPort,&MYBORDER,0,0);
  3553.  
  3554.      MASK |= BMASK;
  3555.   }
  3556.  
  3557.   return NewBM;
  3558. }
  3559.  
  3560. BOOL PasteWin (struct BitMap *SrcBM,struct Window *DstWin,WORD SrcWidth,WORD SrcHeight)
  3561. {
  3562. BOOL Success = FALSE;
  3563.  
  3564. WORD DstWinWidth,DstWinHeight;
  3565.  
  3566. struct BitMap *TmpBM;
  3567.  
  3568.   if (SrcBM)
  3569.   {
  3570.      DstWinWidth = ((DstWin->Flags & WFLG_GIMMEZEROZERO) ? DstWin->GZZWidth : DstWin->Width);
  3571.  
  3572.      DstWinHeight = ((DstWin->Flags & WFLG_GIMMEZEROZERO) ? DstWin->GZZHeight : DstWin->Height);
  3573.  
  3574.      TmpBM = AllocBitMap (DstWinWidth,DstWinHeight,DstWin->RPort->BitMap->Depth,BMF_INTERLEAVED | BMF_CLEAR,NULL);
  3575.  
  3576.      if (TmpBM)
  3577.      {
  3578.         BSA.bsa_SrcWidth    = SrcWidth;
  3579.         BSA.bsa_SrcHeight   = SrcHeight;
  3580.         BSA.bsa_XSrcFactor  = SrcWidth;
  3581.         BSA.bsa_YSrcFactor  = SrcHeight;
  3582.         BSA.bsa_XDestFactor = DstWinWidth;
  3583.         BSA.bsa_YDestFactor = DstWinHeight;
  3584.         BSA.bsa_SrcBitMap   = SrcBM;
  3585.         BSA.bsa_DestBitMap  = TmpBM;
  3586.  
  3587.         BitMapScale (&BSA);
  3588.  
  3589.         BltBitMapRastPort (TmpBM,0,0,DstWin->RPort,0,0,DstWinWidth,DstWinHeight,0xC0);
  3590.  
  3591.         FreeBitMap (TmpBM);
  3592.  
  3593.         Success = TRUE;
  3594.      }
  3595.  
  3596.      FreeBitMap (SrcBM);
  3597.  
  3598.      MASK ^= BMASK;
  3599.   }
  3600.  
  3601.   return Success;
  3602. }
  3603.  
  3604. LONG WinDump (struct Window *Win)
  3605. {
  3606. struct IODRPReq *IODrp;
  3607. struct MsgPort  *PrinterPort;
  3608. struct ViewPort *Vp;
  3609.  
  3610. LONG Error = PDERR_BADDIMENSION;
  3611.  
  3612.   if (! Win) return Error;
  3613.  
  3614.   if (PrinterPort = CreatePort (0,0))
  3615.   {
  3616.      if (IODrp = (struct IODRPReq *) CreateExtIO (PrinterPort,sizeof (struct IODRPReq)))
  3617.      {
  3618.         if (! (Error = OpenDevice ("printer.device",0,(struct IORequest *) IODrp,0)))
  3619.         {
  3620.            Vp = ViewPortAddress (Win);
  3621.  
  3622.            IODrp->io_Command   = PRD_DUMPRPORT;
  3623.            IODrp->io_RastPort  = Win->RPort;
  3624.            IODrp->io_ColorMap  = Vp->ColorMap;
  3625.            IODrp->io_Modes     = (ULONG) Vp->Modes;
  3626.            IODrp->io_SrcX      = Win->LeftEdge;
  3627.            IODrp->io_SrcY      = Win->TopEdge;
  3628.            IODrp->io_SrcWidth  = Win->Width;
  3629.            IODrp->io_SrcHeight = Win->Height;
  3630.            IODrp->io_DestCols  = 0;
  3631.            IODrp->io_Special   = SPECIAL_FULLCOLS | SPECIAL_ASPECT;
  3632.  
  3633.            Error = DoIO ((struct IORequest *)IODrp);
  3634.  
  3635.            CloseDevice ((struct IORequest *)IODrp);
  3636.         }
  3637.  
  3638.         DeleteExtIO ((struct IORequest *)IODrp);
  3639.      }
  3640.  
  3641.      DeletePort (PrinterPort);
  3642.   }
  3643.  
  3644.   return Error;
  3645. }
  3646.  
  3647. ULONG Fail (UBYTE *ErrorString,ULONG ErrorLevel)
  3648. {
  3649.   DisplayAlert (RECOVERY_ALERT,ErrorString,30);
  3650.  
  3651.   RETURNVALUE = ErrorLevel;
  3652.  
  3653.   return RETURNVALUE;
  3654. }
  3655.  
  3656. LONG main (ULONG Argc,UBYTE **Argv)
  3657. {
  3658. UBYTE **ToolTypes;
  3659.  
  3660.   if ((ToolTypes = ArgArrayInit (Argc,Argv)))
  3661.   {
  3662.      MYILBM.Bmhd.w       = ArgInt (ToolTypes,"SCREENWIDTH",DEF_WIDTH);
  3663.      MYILBM.Bmhd.h       = ArgInt (ToolTypes,"SCREENHEIGHT",DEF_HEIGHT);
  3664.      MYILBM.Bmhd.nPlanes = ArgInt (ToolTypes,"SCREENPLANES",DEF_PLANES);
  3665.  
  3666.      sscanf (ArgString (ToolTypes,"SCREENMODE",DEF_MONITORSTR),"%lx",&MYILBM.camg);
  3667.      sscanf (ArgString (ToolTypes,"REALMIN",INIT_DEF_RMINSTR),"%lf",&RMIN);
  3668.      sscanf (ArgString (ToolTypes,"REALMAX",INIT_DEF_RMAXSTR),"%lf",&RMAX);
  3669.      sscanf (ArgString (ToolTypes,"IMAGMIN",INIT_DEF_IMINSTR),"%lf",&IMIN);
  3670.      sscanf (ArgString (ToolTypes,"IMAGMAX",INIT_DEF_IMAXSTR),"%lf",&IMAX);
  3671.  
  3672.      ArgArrayDone ();
  3673.  
  3674.      MYILBM.Bmhd.w       = MIN (MAX_WIDTH,MAX (MYILBM.Bmhd.w,DEF_WIDTH));
  3675.  
  3676.      MYILBM.Bmhd.h       = MIN (MAX_HEIGHT,MAX (MYILBM.Bmhd.h,DEF_HEIGHT));
  3677.  
  3678.      MYILBM.Bmhd.nPlanes = MIN (MAX_DEPTH,MAX (MYILBM.Bmhd.nPlanes,MIN_DEPTH));
  3679.   }
  3680.  
  3681.   else
  3682.   {
  3683.      MYILBM.camg = DEF_MONITOR;
  3684.  
  3685.      MYILBM.Bmhd.w = DEF_WIDTH;
  3686.  
  3687.      MYILBM.Bmhd.h = DEF_HEIGHT;
  3688.  
  3689.      MYILBM.Bmhd.nPlanes = (CheckGFX () ? MAX_DEPTH : DEF_PLANES);
  3690.   }
  3691.  
  3692.   if (ModeNotAvailable (MYILBM.camg)) MYILBM.camg = ModeFallBack (MYILBM.camg,MYILBM.Bmhd.w,MYILBM.Bmhd.h,MYILBM.Bmhd.nPlanes);
  3693.  
  3694.   if (GetMaxPlanes (MYILBM.camg) < MIN_DEPTH)
  3695.   {
  3696.      Fail (OpenDisplayError,20L);
  3697.  
  3698.      exit (RETURNVALUE);
  3699.   }
  3700.  
  3701.   PALETTE = (CheckGFX () ? COLORS_32_AGA : COLORS_32_ECS);
  3702.  
  3703.   if ((RMIN >= RMAX) || (IMIN >= IMAX))
  3704.   {
  3705.     DEF_RMIN = INIT_DEF_RMIN;
  3706.  
  3707.     DEF_RMAX = INIT_DEF_RMAX;
  3708.  
  3709.     DEF_IMIN = INIT_DEF_IMIN;
  3710.  
  3711.     DEF_IMAX = INIT_DEF_IMAX;
  3712.   }
  3713.  
  3714.   else
  3715.   {
  3716.     DEF_RMIN = RMIN;
  3717.  
  3718.     DEF_RMAX = RMAX;
  3719.  
  3720.     DEF_IMIN = IMIN;
  3721.  
  3722.     DEF_IMAX = IMAX;
  3723.   }
  3724.  
  3725.   SaveCoords ();
  3726.  
  3727.   MYILBM.ParseInfo.propchks = IlbmProps;
  3728.  
  3729.   MYILBM.ParseInfo.collectchks = IlbmCollects;
  3730.  
  3731.   MYILBM.ParseInfo.stopchks = IlbmStops;
  3732.  
  3733.   MYILBM.Bmhd.pageWidth  = 0;
  3734.  
  3735.   MYILBM.Bmhd.pageHeight = 0;
  3736.  
  3737.   MYILBM.stype = CUSTOMSCREEN | SCREENQUIET;
  3738.  
  3739.   MYILBM.TBState = TMASK & MASK;
  3740.  
  3741.   MYILBM.ucliptype = OSCAN_TEXT;
  3742.  
  3743.   MYILBM.EHB = TRUE;
  3744.  
  3745.   MYILBM.Autoscroll = TRUE;
  3746.  
  3747.   MYILBM.IFFPFlags = NULL;
  3748.  
  3749.   FUNCTION = Integer;
  3750.  
  3751.   H_LINE = HLine_S;
  3752.  
  3753.   V_LINE = VLine_S;
  3754.  
  3755.   if (MAINMENU = CreateMenus (ProgMenu,TAG_END))
  3756.   {
  3757.      if (MYILBM.Bmhd.nPlanes < 6)
  3758.      {
  3759.         MAX_ITERATIONS = 63;
  3760.  
  3761.         ItemAddress (MAINMENU,FULLMENUNUM (1,2,4))->Flags ^= CHECKED;
  3762.  
  3763.         ItemAddress (MAINMENU,FULLMENUNUM (1,2,0))->Flags |= CHECKED;
  3764.      }
  3765.  
  3766.      if (CheckEHB (MYILBM.camg))
  3767.      {
  3768.         H_LINE = HLine_S_EHB;
  3769.  
  3770.         V_LINE = VLine_S_EHB;
  3771.      }
  3772.  
  3773.      if (CheckFPU (SysBase->AttnFlags))
  3774.      {
  3775.         FUNCTION = Real;
  3776.  
  3777.         ItemAddress (MAINMENU,FULLMENUNUM (1,5,0))->Flags ^= CHECKED;
  3778.  
  3779.         ItemAddress (MAINMENU,FULLMENUNUM (1,5,1))->Flags |= CHECKED;
  3780.      }
  3781.  
  3782.      if (COLOR_PENS = MakeDisplay (&MYILBM))
  3783.      {
  3784.         COLOR_PENS -= 4L;
  3785.  
  3786.         MANDChunk.LeftEdge = MYILBM.win->LeftEdge;
  3787.  
  3788.         MANDChunk.TopEdge = MYILBM.win->TopEdge;
  3789.  
  3790.         MANDChunk.Width = MYILBM.win->Width;
  3791.  
  3792.         MANDChunk.Height = MYILBM.win->Height;
  3793.  
  3794.         MANDChunk.RMin = RMIN;
  3795.  
  3796.         MANDChunk.RMax = RMAX;
  3797.  
  3798.         MANDChunk.IMin = IMIN;
  3799.  
  3800.         MANDChunk.IMax = IMAX;
  3801.  
  3802.         MANDChunk.Iterations = MAX_ITERATIONS + 1L;
  3803.  
  3804.         MANDChunk.Special = NULL;
  3805.  
  3806.         SPECIAL_CHUNK.ch_Data = &MANDChunk;
  3807.  
  3808.         PutPointer (MYILBM.win,ZZZPointer,ZZZPW,ZZZPH,ZZZPXO,ZZZPYO,1);
  3809.  
  3810.         ELAPSEDTIME = DrawFractal (MYILBM.win,(LONG) (MYILBM.win->LeftEdge),(LONG) (MYILBM.win->TopEdge),(LONG) (MYILBM.win->Width) - 1L,(LONG) (MYILBM.win->Height) - 1L);
  3811.  
  3812.         PutPointer (MYILBM.win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,2);
  3813.  
  3814.         SetMenuStart (MYILBM.win);
  3815.  
  3816.         ShowTime (MYILBM.win,"Rendering elapsed time:",ELAPSEDTIME);
  3817.  
  3818.         ModifyIDCMP (MYILBM.win,NULL);
  3819.  
  3820.         ClearMenuStrip (MYILBM.win);
  3821.  
  3822.         About (MYILBM.win);
  3823.  
  3824.         ResetMenuStrip (MYILBM.win,MAINMENU);
  3825.  
  3826.         ModifyIDCMP (MYILBM.win,IDCMP_STANDARD);
  3827.  
  3828.         do
  3829.         {
  3830.           while (HandleEvents (&MYILBM) & NEWDISPLAY_MSG)
  3831.           {
  3832.                 if (SMRequest (&MYILBM))
  3833.                 {
  3834.                    MYBITMAP = CopyBitMap (MYILBM.win,MYILBM.win->LeftEdge,MYILBM.win->TopEdge,MYILBM.win->Width,MYILBM.win->Height);
  3835.  
  3836.                    CloseDisplay (&MYILBM,VINFO);
  3837.  
  3838.                    MYILBM.Bmhd.pageWidth  = 0;
  3839.  
  3840.                    MYILBM.Bmhd.pageHeight = 0;
  3841.  
  3842.                    COLOR_PENS = MakeDisplay (&MYILBM);
  3843.  
  3844.                    if (COLOR_PENS)
  3845.                    {
  3846.                       COLOR_PENS -= 4L;
  3847.  
  3848.                       PasteWin (MYBITMAP,MYILBM.win,GetBitMapAttr (MYBITMAP,BMA_WIDTH),GetBitMapAttr (MYBITMAP,BMA_HEIGHT));
  3849.  
  3850.                       if (CheckEHB (MYILBM.camg))
  3851.                       {
  3852.                          if (SPREAD == FALSE)
  3853.                          {
  3854.                             H_LINE = HLine_R_EHB;
  3855.  
  3856.                             V_LINE = VLine_R_EHB;
  3857.                          }
  3858.  
  3859.                          else
  3860.                          {
  3861.                             H_LINE = HLine_S_EHB;
  3862.  
  3863.                             V_LINE = VLine_S_EHB;
  3864.                          }
  3865.                       }
  3866.  
  3867.                       else
  3868.                       {
  3869.                          if (SPREAD == FALSE)
  3870.                          {
  3871.                             H_LINE = HLine_R;
  3872.  
  3873.                             V_LINE = VLine_R;
  3874.                          }
  3875.  
  3876.                          else
  3877.                          {
  3878.                             H_LINE = HLine_S;
  3879.  
  3880.                             V_LINE = VLine_S;
  3881.                          }
  3882.                       }
  3883.  
  3884.                       if (Choice (MYILBM.win,"Rendering requester","Recalculate ?"))
  3885.                       {
  3886.                          SetMenuStop (MYILBM.win);
  3887.  
  3888.                          PutPointer (MYILBM.win,ZZZPointer,ZZZPW,ZZZPH,ZZZPXO,ZZZPYO,1);
  3889.  
  3890.                          ELAPSEDTIME = DrawFractal (MYILBM.win,(LONG) (MYILBM.win->LeftEdge),(LONG) (MYILBM.win->TopEdge),(LONG) (MYILBM.win->Width) - 1L,(LONG) (MYILBM.win->Height) - 1L);
  3891.  
  3892.                          PutPointer (MYILBM.win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,2);
  3893.  
  3894.                          SetMenuStart (MYILBM.win);
  3895.  
  3896.                          ShowTime (MYILBM.win,"Rendering elapsed time:",ELAPSEDTIME);
  3897.                       }
  3898.                   }
  3899.  
  3900.                   else
  3901.                   {
  3902.                          Fail (MakeDisplayError,20L);
  3903.  
  3904.                          break;
  3905.                   }
  3906.                }
  3907.           }
  3908.  
  3909.           if (RETURNVALUE >= 20L) break;
  3910.  
  3911.         } while (! Choice (MYILBM.win,"Exit requester","Are you sure ?"));
  3912.  
  3913.         if (BMASK & MASK) FreeBitMap (MYBITMAP);
  3914.      }
  3915.  
  3916.      else Fail (MakeDisplayError,20L);
  3917.  
  3918.      CloseDisplay (&MYILBM,VINFO);
  3919.  
  3920.      FreeMenus (MAINMENU);
  3921.   }
  3922.  
  3923.   else Fail (MenuError,20L);
  3924.  
  3925.   exit (RETURNVALUE);
  3926. }
  3927.